library(here)
library(tidyverse)
library(readxl)
# "RODBC", "here", "rnaturalearth", "rnaturalearthdata", "maps", "mapdata", "marmap", "rgdal")
 

Read in the EMA data files


BASIS_Zoo_1999_2004 <- read_xlsx(here( "data", "Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_1999_2004.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))


BASIS_Zoo_2005_2009 <- read_xlsx (here("data", "Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_2005_2009.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))

BASIS_Zoo_2010_2013 <- read_xlsx (here("data", "Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_2010_2013.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))

BASIS_Zoo_2014_2017 <- read_xlsx (here("data", "Raw-Data", "EMA-Historical-Data", "BASIS_Zoo_2014_2017_LonCorrected.xlsx"), col_types = c("text", "text", "text", "numeric", "text", "numeric", "date", "date", "date", "numeric", "numeric", "text", "numeric", "numeric", "text", "text", "numeric", "text", "numeric", "text", "text", "text", "text", "numeric", "numeric", "numeric", "text", "text", "numeric", "numeric", "numeric", "numeric", "numeric", "numeric"))

EMA_Combined <- rbind(BASIS_Zoo_1999_2004, BASIS_Zoo_2005_2009, BASIS_Zoo_2010_2013, BASIS_Zoo_2014_2017)

rm(BASIS_Zoo_1999_2004, BASIS_Zoo_2005_2009, BASIS_Zoo_2010_2013, BASIS_Zoo_2014_2017)

Convert EMA fields into EcoDAAT fields


#Create DAY, MONTH, YEAR columns from "HaulDate"

EMA_Combined_Recode <-  EMA_Combined
 
EMA_Combined_Recode <- separate(EMA_Combined_Recode, HaulDate, c("YEAR", "MONTH", "DAY"), sep="-")

#Delete year column from the HaulID as there is already a year column

EMA_Combined_Recode$YEAR <- NULL
EMA_Combined_Recode <- rename(EMA_Combined_Recode, YEAR = Year)


#Extract Cruise code 
EMA_Combined_Recode$CRUISE <- substring (EMA_Combined_Recode$StationID, 5,6)

EMA_Combined_Recode$CRUISE_ID <- substring (EMA_Combined_Recode$StationID, 7,8)

#Recod Cruise code with ship ID and 

EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "01"] <- "SS"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "02"] <- "NWE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "03"] <- "DY"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "04"] <- "GP"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "05"] <- "EE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "06"] <- "HE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "07"] <- "LU"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "08"] <- "BE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "09"] <- "AE"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "10"] <- "JC"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "11"] <- "ST"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "12"] <- "CH"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "13"] <- "SA"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "14"] <- "QU"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "15"] <- "CF"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE == "16"] <- "OS"

#Get last two digits of year

EMA_Combined_Recode$CRUISE_YEAR <- substring (EMA_Combined_Recode$YEAR, 3,4)

#Combined CRUISE with 

EMA_Combined_Recode <- unite(EMA_Combined_Recode, "CRUISE", CRUISE, CRUISE_YEAR, sep="")

EMA_Combined_Recode <- unite(EMA_Combined_Recode, "CRUISE", CRUISE, CRUISE_ID, sep = "-")


#Count number of cruises in the EMA dataset

EMA_Combined_Recode_byCRUISE <- group_by(EMA_Combined_Recode, CRUISE)
EMA_Combined_Recode_CruiseCount <- summarise(EMA_Combined_Recode_byCRUISE, n_distinct(YEAR))

ungroup(EMA_Combined_Recode)


#Recode cruises to match nomenclature change in 2013 (i.e., 2DY12 becomes DY13-02 in 2013)

EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="BE11-01"] <- "1BE11"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="BE12-01"] <- "1BE12"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY07-02"] <- "2OD07"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY08-06"] <- "6DY08"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY09-05"] <- "5DY09"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY10-04"] <- "4DY10"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY11-04"] <- "4DY11"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="DY12-03"] <- "3DY12"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="EE09-01"] <- "1EE09"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="EE10-01"] <- "1EE10"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="GP00-01"] <- "1GP00"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="GP99-01"] <- "1GP99"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="NWE06-01"] <- "1NW06"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS02-01"] <- "1SS02"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS03-01"] <- "1SS03"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS04-01"] <- "1SS04"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS05-01"] <- "1SS05"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS06-01"] <- "1SS06"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="SS07-01"] <- "1SS07"
EMA_Combined_Recode$CRUISE[EMA_Combined_Recode$CRUISE=="NWE17-05"] <- "NW17-05"

#Remove a few files

rm(EMA_Combined_Recode_byCRUISE, EMA_Combined_Recode_CruiseCount)


#Rename Abundance to EST_NUM_PERM3

EMA_Combined_Recode <- rename(EMA_Combined_Recode, EST_NUM_PERM3 = Abundance)

#Rename GearDepth to MAX_GEAR_DEPTH and use to calculate EST_NUM_PERM3

EMA_Combined_Recode <- rename(EMA_Combined_Recode, MAX_GEAR_DEPTH = GearDepth)

#Compute EST_NUM_PERM2 = EST_NUM_PERM3 * MAX_GEAR_DEPTH

EMA_Combined_Recode$EST_NUM_PERM2 <- EMA_Combined_Recode$EST_NUM_PERM3*EMA_Combined_Recode$MAX_GEAR_DEPTH

#Create columns GEAR_NAME, MESH from GearCode column

EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo153"] <- "20BON_153"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo333"] <- "60BON_333"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo505"] <- "60BON_505"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Bongo80"] <- "80BON_153"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "Juday"] <- "Juday_168"
EMA_Combined_Recode$GearCode[EMA_Combined_Recode$GearCode == "PairoVET"] <- "PairoVET_153"

EMA_Combined_Recode <- separate(EMA_Combined_Recode, GearCode, c("GEAR_NAME", "MESH"), sep = "_")

#Rename GearInTime to GMT_DATE_TIME_TXT

EMA_Combined_Recode <- rename(EMA_Combined_Recode, GMT_DATE_TIME_TXT = GearInTime)
  
#Rename Quality to HAUL_PERFORMANCE and recode to match EcoDAAT 

EMA_Combined_Recode <- rename(EMA_Combined_Recode, HAUL_PERFORMANCE = Quality)

EMA_Combined_Recode$HAUL_PERFORMANCE[EMA_Combined_Recode$HAUL_PERFORMANCE == "G"] <- "GOOD"
EMA_Combined_Recode$HAUL_PERFORMANCE[EMA_Combined_Recode$HAUL_PERFORMANCE == "Q"] <- "QUEST"

#Create LAT and LON column from GearInLatitude and Gear in Longitude

EMA_Combined_Recode <- rename(EMA_Combined_Recode, LAT = GearInLatitude)

EMA_Combined_Recode <- rename(EMA_Combined_Recode, LON = GearInLongitude)

#Create column SEX_NAME from Sex and recode to match EcoDAAT categories

EMA_Combined_Recode <- rename(EMA_Combined_Recode, SEX_NAME = Sex)

EMA_Combined_Recode$SEX_NAME[EMA_Combined_Recode$SEX_NAME == "M"] <- "MALE"
EMA_Combined_Recode$SEX_NAME[EMA_Combined_Recode$SEX_NAME == "F"] <- "FEMALE"
EMA_Combined_Recode$SEX_NAME[EMA_Combined_Recode$SEX_NAME == "U"] <- "NOT DETERMINED"

#EMA Size categories are numerous, so keep this column, but rename as SIZE_NAME for merging

EMA_Combined_Recode <- rename(EMA_Combined_Recode, SIZE_NAME = Size)

#Create STAGE_NAME category by renaming "StageCode" and recoding

EMA_Combined_Recode <- rename(EMA_Combined_Recode, STAGE_NAME = StageCode)

EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "A"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "A & J"] <- "A + J (ADULT/JUVENILE)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "adult"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Adult"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1"] <- "C - 1 (COPEPODITE I)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-2"] <- "C-1 TO C-2"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-3"] <- "C-1 TO C-3"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-4"] <- "C-1 TO C-4"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-5"] <- "C-1 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C1-C4"] <- "C-1 TO C-4"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C2"] <- "C - 2 (COPEPODITE II)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C2-C3"] <- "C-2 TO C-3"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C2-C5"] <- "C-2 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C3"] <- "C - 3 (COPEPODITE III)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C3-C4"] <- "C-3 TO C-4"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C3-C5"] <- "C-3 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C4"] <- "C - 4 (COPEPODITE IV)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C4-C5"] <- "C-4 TO C-5"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C4-C6"] <- "C-4 TO C-6"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C5"] <- "C - 5 (COPEPODITE V)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "C6"] <- "ADULT"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis 1"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis 2"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "calyptopis 3"] <- "CALYPTOPIS (STAGE NOT DETERMINED)"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "cypris"] <- "CYPRIS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Cypris"] <- "CYPRIS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "egg"] <- "EGG"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Egg"] <- "EGG"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "furcilia"] <- "FURCILIA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Furcilia"] <- "FURCILIA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "J"] <- "JUVENILE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "juvenile"] <- "JUVENILE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Juvenile"] <- "JUVENILE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "larva"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Larva"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "larval"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Larval"] <- "LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "medusa"] <- "MEDUSA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Medusa"] <- "MEDUSA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "megalopa"] <- "MEGALOPAE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Megalopa"] <- "MEGALOPAE"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "nauplius"] <- "NAUPLIUS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Nauplius"] <- "NAUPLIUS"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "ND"] <- "NOT DETERMINED"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "post-larva"] <- "POST LARVA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "U"] <- "NOT DETERMINED"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "zoea"] <- "ZOEA"
EMA_Combined_Recode$STAGE_NAME[EMA_Combined_Recode$STAGE_NAME == "Zoea"] <- "ZOEA"

#Create Column STATION_NAME by using the last 3 digits of StationID

EMA_Combined_Recode$STATION_NAME<- substring (EMA_Combined_Recode$StationID, 9,11)

#Create TAXON_NAME column and recode to match EcoDAAT

EMA_Combined_Recode <- rename(EMA_Combined_Recode, TAXON_NAME = Current_Name)

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Acanthomysis sp."] <- "Acanthomysis spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Acanthomysis stelleri"] <- "Acanthomysis stelleri (Exacanthomysis arctopacifica)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Anthoathecatae"] <- "Anthoathecata (Anthomedusae)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Cancridae"] <- "Cancridae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Candacia columbiae"] <- "Candacia Columbiae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Caprellidea"] <- "Caprellidae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Clytia gregaria"] <- "Clytia gregaria (Phialidium gregarium)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Cnidaria"] <- "Cnidarian medusae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Corophium spp."] <- "Corophium"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Disacanthomysis dybowskii"] <- "Discanthomysis (Acanthomysis) Dybowskii"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Epilabidocera amphitrites"] <- "Epilabidocera amphitrites (E. longipedata)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Epilabidocera longipedata"] <- "Epilabidocera amphitrites (E. longipedata)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Euphausia spp."] <- "Euphausiacea"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Eurytemora pacifica"] <- "Eurytemora pacifica (E. johanseni)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Eurytemora sp."] <- "Eurytemora spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Gammaridae"] <- "Gammaridea (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Gammaridea"] <- "Gammaridea (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Hippolytidae"] <- "Hippolytidae (Caridea)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Hydromedusae (Hydroidolina"] <- "Hydromedusae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Leptothecatae"] <- "Leptothecata (Leptomedusae)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Lithodidae"] <- "Lithodidae (Anomura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Majidae"] <- "Majidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Meterythrops robusta"] <- "Meterythrops robustus (M. robusta)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Mysida"] <- "Mysida (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Octopoda"] <- "Octopodiformes (Octopus) larvae"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Oithona setigera"] <- "Oithona setigera (O. spinirostris)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Oithona spinirostris"] <- "Oithona setigera (O. spinirostris)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Chionoecetes spp."] <- "Oregoniidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Hyas spp."] <- "Oregoniidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Oregoniidae"] <- "Oregoniidae (Brachyura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Pacifacanthomysis nephrophthalma"] <- "Pacifacanthomysis (Acanthomysis) nephrophthalma"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Paguridae"] <- "Paguridae (Anomura)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Paraeuchaeta elongata"] <- "Paraeuchaeta elongata (Euchaeta elongata)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Parasagitta elegans"] <- "Parasagitta (Sagitta) elegans"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Phoronida (actinotroch larva)"] <- "Phoronida actinotroch (larvae)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Podon leuckartii"] <- "Podon leuckarti"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Pseudoamallothrix ovata"] <- "Pseudoamallothrix (scolecithricella) ovata"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Syrrhoe"] <- "Syrrhoe spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Tessarabrachion oculatus"] <- "Tessarabrachion oculatum"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Thecosomata"] <- "Thecosomata (Unidentifiable)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Themisto pacifica"] <- "Themisto pacifica (Parathemisto pacifica)"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Triconia sp."] <- "Triconia spp."

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Calanidae"] <- "Unidentified Calanids"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Calanoida"] <- "Unidentified Calanids"

EMA_Combined_Recode$TAXON_NAME[EMA_Combined_Recode$TAXON_NAME == "Xenacanthomysis pseudomacropsis"] <- "Xenoacanthomysis (Acanthomysis) pseudomacropsis"



#Create VOLUME_FILTERED column by renaming TowVOlume column

EMA_Combined_Recode <- rename(EMA_Combined_Recode, VOLUME_FILTERED = TowVolume)

#Rename BottomDepth to BOTTOM_DEPTH to match EcoDAAT

EMA_Combined_Recode <- rename(EMA_Combined_Recode, BOTTOM_DEPTH = BottomDepth)


#Rearrange the file to add a column indicating origin of data, to have them in the same order as the EcoDAAT file and remove non-matched columns prior to merge


EMA_Combined_Recode$DATA_SOURCE <- "EMA"

#Inset columns not present in EMA, but will be in EcoDAAT

EMA_Combined_Recode$DIS_PERVOLM2 <- NA
EMA_Combined_Recode$DIS_PERVOLM3 <- NA
EMA_Combined_Recode$FOCI_ID <- NA
EMA_Combined_Recode$FOCI_SAMPLE_ID <- NA
EMA_Combined_Recode$GEOGRAPHIC_AREA <- NA
EMA_Combined_Recode$HAUL_ID <- NA
EMA_Combined_Recode$HAUL_NAME <- NA
EMA_Combined_Recode$MIN_GEAR_DEPTH <- NA
EMA_Combined_Recode$NET <- NA
EMA_Combined_Recode$SAMPLE_DEPTH <- NA
EMA_Combined_Recode$SEX <- NA
EMA_Combined_Recode$SPECIMEN_FORM <- NA
EMA_Combined_Recode$STAGE <- NA
EMA_Combined_Recode$TAXON_SIZE <- NA
EMA_Combined_Recode$ZOOP_COPEPOD_NAUPLII <- NA
EMA_Combined_Recode$ZOOP_EUPHAUSIID_EGG <- NA


#Create HAUL_ID column information for merging purposes

EMA_Combined_Recode$HAUL_ID <- paste0(EMA_Combined_Recode$CRUISE," ",EMA_Combined_Recode$STATION_NAME," ", 1," ", EMA_Combined_Recode$GEAR_NAME," ", 1)


#Create vector of column names from the EcoDAAT File

EcoDAAT_ColumnNames <- c("BOTTOM_DEPTH", "CRUISE", "DAY", "DIS_PERVOLM2", "DIS_PERVOLM3", "EST_NUM_PERM2", "EST_NUM_PERM3", "FOCI_ID", "FOCI_SAMPLE_ID", "GEAR_NAME", "GEOGRAPHIC_AREA", "GMT_DATE_TIME_TXT", "HAUL_ID", "HAUL_NAME", "HAUL_PERFORMANCE", "LAT", "LON", "MAX_GEAR_DEPTH", "MESH", "MIN_GEAR_DEPTH", "MONTH", "NET", "SAMPLE_DEPTH", "SEX", "SEX_NAME", "SIZE_NAME", "SPECIMEN_FORM", "STAGE", "STAGE_NAME", "STATION_NAME", "TAXON_NAME", "TAXON_SIZE", "VOLUME_FILTERED",  "YEAR", "ZOOP_COPEPOD_NAUPLII", "ZOOP_EUPHAUSIID_EGG", "DATA_SOURCE")

EMA_Combined_Recode <- EMA_Combined_Recode[, EcoDAAT_ColumnNames]

Import EcoDAAT data

Connect to database to import zoop data directly from EcoDAAT

#Create connect to the AFSC database
# 
# user <- readline("Input Username: ")
# pswd <- readline("Input Password: ")
# 
# AFSC_Connect <- odbcConnect("AFSC", uid=user,  pwd=pswd)
# 
# 
# #Delete and refresh table to draw from, in this case it is SPECIMEN_MAIN_GEOM
# 
# sqlQuery(AFSC_Connect,"DROP TABLE SPECIMEN_MAIN_GEOM;")
# 
# sqlQuery(AFSC_Connect,"CREATE TABLE SPECIMEN_MAIN_GEOM AS SELECT * FROM ECODAAT.SPECIMEN_MAIN_GEOM;")


#Run SQL Queries to build zooplankton dataset 
# 
# #Query the database
# 
# zoopdata <- sqlQuery(AFSC_Connect, "SELECT BOTTOM_DEPTH,
# CRUISE, DAY, DIS_PERVOLM2, DIS_PERVOLM3, EST_NUM_PERM2, EST_NUM_PERM3, FOCI_ID, FOCI_SAMPLE_ID, GEAR_NAME, 
# GEOGRAPHIC_AREA, GMT_DATE_TIME_TXT, HAUL_ID, HAUL_NAME, HAUL_PERFORMANCE, LAT, LON, MAX_GEAR_DEPTH, MESH,
# MIN_GEAR_DEPTH, MONTH, NET, SAMPLE_DEPTH, SEX, SEX_NAME, SIZE_NAME, SPECIMEN_FORM, STAGE, STAGE_NAME, STATION_NAME,
# TAXON_NAME, TAXON_SIZE, VOLUME_FILTERED, YEAR, ZOOP_COPEPOD_NAUPLII, ZOOP_EUPHAUSIID_EGG
# FROM SPECIMEN_MAIN_GEOM WHERE ORIG_DB LIKE 'BOB';", stringsAsFactors=FALSE)

#Close database connection
 
# odbcClose(AFSC_Connect)

#Drop one cruise using the old protocol OS17 and replace with correct data
zoopdata <- read_csv(here("data","AllZoopRaw.csv")) %>%
  filter(!CRUISE=="OS17-01") %>%
  dplyr::select(-...1)
New names:
• `` -> `...1`
Rows: 825071 Columns: 37
── Column specification ───────────────────────────────────────────────────────────────
Delimiter: ","
chr  (15): CRUISE, FOCI_ID, FOCI_SAMPLE_ID, GEAR_NAME, GEOGRAPHIC_AREA, HAUL_ID, HA...
dbl  (21): ...1, BOTTOM_DEPTH, DAY, DIS_PERVOLM2, DIS_PERVOLM3, EST_NUM_PERM2, EST_...
dttm  (1): GMT_DATE_TIME_TXT

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#Bring in OS17-01
OS1701 <- read.csv(here("data", "Raw-Data", "OS1701_EcoFOCI_ZooplanktonNet.csv"))

zoopdata <- rbind(zoopdata, OS1701)

#Delete OS1701

rm(OS1701)

Do some data tidying for the EcoDAAT data set and combine the EcoDAAT and EMA datasets


#Recode mesh sizes for 150, 333, 500

zoopdata$MESH[zoopdata$MESH==150] <- 153
zoopdata$MESH[zoopdata$MESH==154] <- 153
zoopdata$MESH[zoopdata$MESH==1153] <- 153
zoopdata$MESH[zoopdata$MESH==335] <- 333
zoopdata$MESH[zoopdata$MESH==500] <- 505


#Count number of cruises in the EMA dataset

EMA_Combined_Recode_byCRUISE <- group_by(EMA_Combined_Recode, CRUISE)
EMA_Combined_Recode_CruiseCount <- summarise(EMA_Combined_Recode_byCRUISE, n_distinct(YEAR))

ungroup(EMA_Combined_Recode)

#Count number of cruises in the EMA dataset

zoopdata_byCRUISE <- group_by(zoopdata, CRUISE)
zoopdata_CruiseCount <- summarise(zoopdata_byCRUISE, n_distinct(YEAR))

ungroup(zoopdata)
 

#Do a join to see if cruises have matches in both datasets:

TestData <- semi_join(EMA_Combined_Recode_CruiseCount, zoopdata_CruiseCount, by = "CRUISE")




#10 cruises are present in EMA dataset and zoopdata data set, remove those from the EMA dataset to avoid double counting

EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="1GP99")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="3DY12")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="AE14-01")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="AE15-01")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY14-06")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY14-08")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY15-07")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY15-08")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="DY16-09")
EMA_Combined_Recode <- filter(EMA_Combined_Recode, CRUISE!="NW17-05")

#RemoveFiles

rm(EMA_Combined_Recode_byCRUISE, EMA_Combined_Recode_CruiseCount, zoopdata_byCRUISE, zoopdata_CruiseCount, TestData)

#Combine the EMA and EcoDAAT datasets

#Add Data Source file to the zoopdata prior to combination

zoopdata$DATA_SOURCE <- "EcoDAAT"


#Combine datasets 

AllZoop_Raw <- rbind(EMA_Combined_Recode, zoopdata)



#Create vector of Combined column names to trim dataset for final processing

Combined_ColumnNames <- c("BOTTOM_DEPTH", "CRUISE", "DAY", "DIS_PERVOLM2", "DIS_PERVOLM3", "EST_NUM_PERM2", "EST_NUM_PERM3", "GEAR_NAME", "GMT_DATE_TIME_TXT", "HAUL_ID", "HAUL_PERFORMANCE", "LAT", "LON", "MAX_GEAR_DEPTH", "MESH", "MONTH", "SPECIMEN_FORM", "SEX_NAME", "SIZE_NAME", "STAGE_NAME", "STATION_NAME", "TAXON_NAME", "VOLUME_FILTERED",  "YEAR", "DATA_SOURCE")

#Keep only those columns

AllZoop_Raw <- AllZoop_Raw[,Combined_ColumnNames]

#Remove files

rm (EMA_Combined, EMA_Combined_Recode, zoopdata)

Quick map of the raw data stations

#Quick plot to take a look at the dataset so far

#Get world data from #natural earth package

world <- ne_countries(scale = "medium", returnclass = "sf")
class(world)

# get regional polygons
reg = map_data("world2Hires")
reg = subset(reg, region %in% c('USSR', 'USA'))

# convert lat longs
reg$long = (360 - reg$long)*-1

# set map limits
lons = c(-179.5, -130)
lats = c(50, 74)


######################################
# 
# # make plot
# Region_Map_RawData <- ggplot()+
# 
#   # add coastline
#   geom_sf(data = world)+
#     coord_sf(xlim = lons, ylim = lats, expand = FALSE)+
# 
#   #Plot station points
#   geom_point(data=AllZoop_Raw, mapping=aes(LON, LAT))+
# 
#   # formatting
#   theme_bw()+
#   xlab("Longitude")+
#   ylab("Latitude")
# 
# Region_Map_RawData

Data Filtering for BP Synthesis Project


#First filter for all data north of 60N
       
#
NBS_Zoop <- filter(AllZoop_Raw, LAT>=55)


#Now map again to take a look
# 
# # make plot
# Region_Map_NBS_Process_1 <- ggplot()+
# 
#   # add coastline
#   geom_sf(data = world)+
#     coord_sf(xlim = lons, ylim = lats, expand = FALSE)+
# 
#   #Plot station points
#   geom_point(data=NBS_Zoop, mapping=aes(LON, LAT))+
# 
#   # formatting
#   theme_bw()+
#   xlab("Longitude")+
#   ylab("Latitude")
# 
# Region_Map_NBS_Process_1
# 
# 
# #Looks like some data from the GOA is still present, so remove data > 155

#
NBS_Zoop <- filter(NBS_Zoop, LON<= -150)

#Now map again to take a look
# 
# # make plot
# Region_Map_NBS_Process_2 <- ggplot()+
# 
#   # add coastline
#   geom_sf(data = world)+
#     coord_sf(xlim = lons, ylim = lats, expand = FALSE)+
# 
#   #Plot station points
#   geom_point(data=NBS_Zoop, mapping=aes(LON, LAT))+
# 
#   # formatting
#   theme_bw()+
#   xlab("Longitude")+
#   ylab("Latitude")
# 
# Region_Map_NBS_Process_2
# 
# #Spatial coverage looks correct

#Now check temporal coverage

sort(unique(NBS_Zoop$YEAR), decreasing = FALSE)
 [1] 1987 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003
[17] 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
#Remove data from 1996 as it is removed from all other years of collection

NBS_Zoop <- filter(NBS_Zoop, YEAR!=1996)

#Take a look at the gears present in the dataset

unique(NBS_Zoop$GEAR_NAME)
 [1] "60BON"    "Juday"    "PairoVET" "80BON"    "20BON"    "TUCK1"    "SLED"    
 [8] "LG-CB"    "V60BON"   "MBT"      "MOC1"     "CALVET"   "CTDB"     "METH"    
[15] "QUADNET"  "IKMT"    
unique(NBS_Zoop$MESH)
 [1] "505"  "333"  "168"  "153"  "3000" "1000" "53"   NA     "0"    "1500" "6000"
#Rough estimate of number of samples by gear type

NBS_Zoop_Gear <- NBS_Zoop[, c("CRUISE", "GEAR_NAME", "MESH", "LAT", "LON")]

NBS_Zoop_Gear <- distinct(NBS_Zoop_Gear)

NBS_Zoop_Gear_byGear <- group_by(NBS_Zoop_Gear, GEAR_NAME, MESH)

NBS_Gear_Summary <- summarise(NBS_Zoop_Gear_byGear, n())
`summarise()` has grouped output by 'GEAR_NAME'. You can override using the `.groups`
argument.
ungroup(NBS_Zoop_Gear)

#This shows a few gears can be eliminated for low sample size (V60BON, 80BON) and CALVET has too small mesh size

NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="CALVET")
NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="V60BON")
NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="80BON")

#Remove sled data as this is biased toward a bottom sample

NBS_Zoop <- filter(NBS_Zoop, GEAR_NAME!="SLED")



#Remove failed and questionable hauls

#First save the NA since EMA data does not always record HAUL_PERFORMANCE

HaulPerf_NA <- NBS_Zoop[is.na(NBS_Zoop$HAUL_PERFORMANCE),]

NBS_Zoop_GOOD <- filter(NBS_Zoop, HAUL_PERFORMANCE=="GOOD")

#Rebuild dataset without QUEST and FAIL HAULS

NBS_Zoop <- rbind(HaulPerf_NA, NBS_Zoop_GOOD)



#Write this raw file prior to further processing

write.csv(NBS_Zoop, here("data", "Raw-Data", "NBS_Zoop_Raw.csv"))

Bring in the Coarse Taxa List to aid in lumping and filter out some taxa


TaxaList_Coarse <- read.csv(here("data", "Taxa-Lists", "TaxaList_Coarse.csv"))

#Now add this to the file

TaxaList_Coarse <- distinct(TaxaList_Coarse)

NBS_Zoop_Process <- left_join(NBS_Zoop, TaxaList_Coarse, by = "TAXON_NAME")

#Filter out those data marked for removal

NBS_Zoop_Process <- filter(NBS_Zoop_Process, NOTE != "Remove")

Create taxa specific data sets to select the correct stages from the correct GEAR_NAME and MESH for each specific coarse taxa

Acartia spp


Acartia_spp <- filter(NBS_Zoop_Process, TAXA_COARSE=="Acartia spp.")

#Acartia is a small copepod, so all estimates should come from the smaller nets

#Filter for correct gear

Acartia_spp <- filter(Acartia_spp, GEAR_NAME!= "60BON")


#Being to build final data set


NBS_Zoop_Process_Final <- Acartia_spp

Aglantha digitale


Aglantha_digitale <- filter(NBS_Zoop_Process, TAXA_COARSE=="Aglantha digitale")

#Choose to estimate Cnidarians from the 60BON only

Aglantha_digitale <- filter(Aglantha_digitale, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Aglantha_digitale)

Amphipods


Amphipoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Amphipoda")

#Amhipods will be estimated from the 60BON only

Amphipoda <- filter(Amphipoda, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Amphipoda)

Anomura


Anomura <- filter(NBS_Zoop_Process, TAXA_COARSE=="Anomura")

#Anomura estimate from 60BON only

Anomura <- filter(Amphipoda, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Anomura)

Appendicularia


Appendicularia <- filter(NBS_Zoop_Process, TAXA_COARSE=="Appendicularia")

#Can filter for both gears and then add a taxa coarse of Appendicularia_large and Appendicular_small

Appendicularia_large <- filter(Appendicularia, GEAR_NAME=="60BON")

#Recode coarse taxa

Appendicularia_large$TAXA_COARSE[Appendicularia_large$TAXA_COARSE=="Appendicularia"] <- "Appendicularia_large"


Appendicularia_small <- filter(Appendicularia, GEAR_NAME!="60BON")

#Recode coarse taxa

Appendicularia_small$TAXA_COARSE[Appendicularia_small$TAXA_COARSE=="Appendicularia"] <- "Appendicularia_small"


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Appendicularia_large, Appendicularia_small)

Bivalvia


Bivalvia <- filter(NBS_Zoop_Process, TAXA_COARSE=="Bivalvia")

#Bivalvia estimate from smaller nets only

Bivalvia <- filter(Bivalvia, GEAR_NAME!="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Bivalvia)

Brachyura


Brachyura <- filter(NBS_Zoop_Process, TAXA_COARSE=="Brachyura")

#Brachyura estimate from 60BON only

Brachyura <- filter(Brachyura, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Brachyura)

Calanus hyperboreus


Calanus_hyperboreus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Calanus hyperboreus")


#Separate EMA data as they were sorted under different protocols

Calanus_hyperboreus_EMA <- filter(Calanus_hyperboreus, DATA_SOURCE=="EMA")
Calanus_hyperboreus_EcoDAAT <- filter(Calanus_hyperboreus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Calanus_hyperboreus_EcoDAAT_bySPECIMEN_FORM <- group_by(Calanus_hyperboreus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Calanus_hyperboreus_EcoDAAT_FormSummary <- summarise(Calanus_hyperboreus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#These look correct

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Calanus_hyperboreus_EMA_byGEAR_NAME <- group_by(Calanus_hyperboreus_EMA, MESH, GEAR_NAME)

Calanus_hyperboreus_EMA_GearSummary <- summarise(Calanus_hyperboreus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Calanus_hyperboreus_EMA <- filter(Calanus_hyperboreus_EMA, MESH != 153)


#The other gears are correct, so rebuild dataset

Calanus_hyperboreus <- rbind(Calanus_hyperboreus_EcoDAAT, Calanus_hyperboreus_EMA)


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Calanus_hyperboreus)

Calanus marshallae/glacialis


Calanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Calanus marshallae/glacialis")

#Separate EMA data as they were sorted under different protocols

Calanus_EMA <- filter(Calanus, DATA_SOURCE=="EMA")
Calanus_EcoDAAT <- filter(Calanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Calanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Calanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Calanus_EcoDAAT_FormSummary <- summarise(Calanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Calanus_EcoDAAT_B <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="B")
Calanus_EcoDAAT_B <- filter(Calanus_EcoDAAT_B, MESH!=153)

Calanus_EcoDAAT_C <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="C")
Calanus_EcoDAAT_C <- filter(Calanus_EcoDAAT_C, MESH==153)
Calanus_EcoDAAT_C <- filter(Calanus_EcoDAAT_C, GEAR_NAME=="20BON")

Calanus_EcoDAAT_G <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="G")

Calanus_EcoDAAT_H <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="H")

Calanus_EcoDAAT_K <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="K")

Calanus_EcoDAAT_L <- filter(Calanus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Calanus_EcoDAAT_Final <- rbind(Calanus_EcoDAAT_B, Calanus_EcoDAAT_C, Calanus_EcoDAAT_G, Calanus_EcoDAAT_H, Calanus_EcoDAAT_K, Calanus_EcoDAAT_L)

ungroup(Calanus_EcoDAAT_Final)

#Remove some files

rm(Calanus_EcoDAAT_bySPECIMEN_FORM, Calanus_EcoDAAT_B, Calanus_EcoDAAT_C, Calanus_EcoDAAT_G, Calanus_EcoDAAT_H, Calanus_EcoDAAT_K, Calanus_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Calanus_EMA_byGEAR_NAME <- group_by(Calanus_EMA, MESH, GEAR_NAME)

Calanus_EMA_GearSummary <- summarise(Calanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Calanus_EMA_60BON <- filter(Calanus_EMA, GEAR_NAME=="60BON")

Calanus_EMA_60BON_333 <- filter(Calanus_EMA_60BON, MESH==333)

Calanus_EMA_60BON_333 <- filter(Calanus_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Calanus_EMA_60BON_505 <- filter(Calanus_EMA_60BON, MESH==505)

Calanus_EMA_60BON_505 <- filter(Calanus_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")

Calanus_EMA_20BON <- filter(Calanus_EMA, GEAR_NAME=="20BON")

Calanus_EMA_20BON_153 <- filter(Calanus_EMA_20BON, MESH==153)

Calanus_EMA_20BON_153 <- filter(Calanus_EMA_20BON_153, STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Calanus_EMA_Final <- rbind(Calanus_EMA_60BON_333, Calanus_EMA_60BON_505, Calanus_EMA_20BON_153)

ungroup(Calanus_EMA_Final)

#Remove some files

rm(Calanus_EMA_byGEAR_NAME, Calanus_EMA_20BON, Calanus_EMA_20BON_153, Calanus_EMA_60BON, Calanus_EMA_60BON_333, Calanus_EMA_60BON_505)

#Combine into final, Calanus data set

Calanus <- rbind(Calanus_EMA_Final, Calanus_EcoDAAT_Final)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Calanus)

Calanus pacificus


Calanus_pacificus <- filter(NBS_Zoop_Process, TAXA_COARSE == "Calanus pacificus")


#Separate EMA data as they were sorted under different protocols

Calanus_pacificus_EMA <- filter(Calanus_pacificus, DATA_SOURCE=="EMA")
Calanus_pacificus_EcoDAAT <- filter(Calanus_pacificus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Calanus_pacificus_EcoDAAT_bySPECIMEN_FORM <- group_by(Calanus_pacificus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Calanus_pacificus_EcoDAAT_FormSummary <- summarise(Calanus_pacificus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#Stages and gear are correct for EcoDAAT data


#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Calanus_pacificus_EMA_byGEAR_NAME <- group_by(Calanus_pacificus_EMA, MESH, GEAR_NAME)

Calanus_pacificus_EMA_GearSummary <- summarise(Calanus_pacificus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
# Need to filter for the correct stages for avoid double counts, just remove one Juday sample

Calanus_pacificus_EMA <- filter(Calanus_pacificus_EMA, GEAR_NAME!="Juday")



#Combine into final, Calanus_pacificus data set

Calanus_pacificus <- rbind(Calanus_pacificus_EMA, Calanus_pacificus_EcoDAAT)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Calanus_pacificus)

Caridea


Caridea <- filter(NBS_Zoop_Process, TAXA_COARSE == "Caridea")

#Caridea estimate from larger nets only

Caridea <- filter(Caridea, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Caridea)

Centropages abdominalis


Centropages <- filter(NBS_Zoop_Process, TAXA_COARSE=="Centropages abdominalis")


#Separate EMA data as they were sorted under different protocols

Centropages_EMA <- filter(Centropages, DATA_SOURCE=="EMA")
Centropages_EcoDAAT <- filter(Centropages, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Centropages_EcoDAAT_bySPECIMEN_FORM <- group_by(Centropages_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Centropages_EcoDAAT_FormSummary <- summarise(Centropages_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#Filter for correct GEAR_NAME and MESH from EcoDAAT

Centropages_EcoDAAT <- filter(Centropages_EcoDAAT, SPECIMEN_FORM!="G")


#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Centropages_EMA_byGEAR_NAME <- group_by(Centropages_EMA, MESH, GEAR_NAME)

Centropages_EMA_GearSummary <- summarise(Centropages_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
#For consistency, select the smaller gear only

Centropages_EMA <- filter(Centropages_EMA, GEAR_NAME!="60BON")


#Recombined data

Centropages <- rbind(Centropages_EcoDAAT, Centropages_EMA)



#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Centropages)

Chaetognatha


Chaetognatha <- filter(NBS_Zoop_Process, TAXA_COARSE=="Chaetognatha")

#Filter for Chaetognatha from the 60BON nets only

Chaetognatha <- filter(Chaetognatha, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Chaetognatha)

Cirripedia


Cirripedia <- filter(NBS_Zoop_Process, TAXA_COARSE == "Cirripedia")

#Can filter for both gears and then add a taxa coarse of Cirripedia_large and Cirripedia_small

Cirripedia_large <- filter(Cirripedia, GEAR_NAME=="60BON")

#Recode coarse taxa

Cirripedia_large$TAXA_COARSE[Cirripedia_large$TAXA_COARSE=="Cirripedia"] <- "Cirripedia_large"


Cirripedia_small <- filter(Cirripedia, GEAR_NAME!="60BON")

#Recode coarse taxa

Cirripedia_small$TAXA_COARSE[Cirripedia_small$TAXA_COARSE=="Cirripedia"] <- "Cirripedia_small"

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cirripedia_large, Cirripedia_small)

Cladocera


Cladocera <- filter(NBS_Zoop_Process, TAXA_COARSE=="Cladocera")

#Cladocera fromt he small net only

#Filter for correct gear

Cladocera <- filter(Cladocera, GEAR_NAME!= "60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cladocera)

Clione limacina


Clione <- filter(NBS_Zoop_Process, TAXA_COARSE=="Clione limacina")

#Estimate from the larger net only

Clione <- filter(Clione, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Clione)

Cnidaria


Cnidaria <- filter(NBS_Zoop_Process, TAXA_COARSE == "Cnidaria")

#Can filter for both gears and then add a taxa coarse of Cnidaria_large and Cnidaria_small

Cnidaria_large <- filter(Cnidaria, GEAR_NAME=="60BON")

#Recode coarse taxa

Cnidaria_large$TAXA_COARSE[Cnidaria_large$TAXA_COARSE=="Cnidaria"] <- "Cnidaria_large"


Cnidaria_small <- filter(Cnidaria, GEAR_NAME!="60BON")

#Recode coarse taxa

Cnidaria_small$TAXA_COARSE[Cnidaria_small$TAXA_COARSE=="Cnidaria"] <- "Cnidaria_small"


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cnidaria_large, Cnidaria_small)

Small and large copepods that do not belong to major taxonomic group



Copepod_small <- filter(NBS_Zoop_Process, TAXA_COARSE == "Copepod_small")

#Filter for the smaller mesh gears only

Copepod_small <- filter(Copepod_small, GEAR_NAME!="60BON")

#Now build the large dataset

Copepod_large <- filter(NBS_Zoop_Process, TAXA_COARSE == "Copepod_large")

#Filter for the smaller mesh gears only

Copepod_large <- filter(Copepod_large, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Copepod_large, Copepod_small)

Ctenophora


Ctenophora <- filter(NBS_Zoop_Process, TAXA_COARSE=="Ctenophora")

#Filter for the large net only

Ctenophora <- filter(Ctenophora, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Ctenophora)

Cumacea


Cumacea <- filter(NBS_Zoop_Process, TAXA_COARSE=="Cumacea")

#Filter for the large net only

Cumacea <- filter(Cumacea, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cumacea)

Decapoda


Decapoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Decapoda")

#Very few measurements of unidentfied decapods. We can ignore

Echinodermata


Echinodermata <- filter(NBS_Zoop_Process, TAXA_COARSE=="Echinodermata")

#Echinodermata are tiny, filter from small nets only

Echinodermata <- filter(Echinodermata, GEAR_NAME!="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Echinodermata)

Epilabidocera longipedata


Epilabidocera <- filter(NBS_Zoop_Process, TAXA_COARSE=="Epilabidocera longipedata")


#Separate EMA data as they were sorted under different protocols

Epilabidocera_EMA <- filter(Epilabidocera, DATA_SOURCE=="EMA")
Epilabidocera_EcoDAAT <- filter(Epilabidocera, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Epilabidocera_EcoDAAT_bySPECIMEN_FORM <- group_by(Epilabidocera_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Epilabidocera_EcoDAAT_FormSummary <- summarise(Epilabidocera_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#Things are correct for the EcoDAAT data, not look at the EMA data


#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Epilabidocera_EMA_byGEAR_NAME <- group_by(Epilabidocera_EMA, MESH, GEAR_NAME)

Epilabidocera_EMA_GearSummary <- summarise(Epilabidocera_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Epilabidocera_EMA_60BON <- filter(Epilabidocera_EMA, GEAR_NAME=="60BON")

Epilabidocera_EMA_60BON_333 <- filter(Epilabidocera_EMA_60BON, MESH==333)

Epilabidocera_EMA_60BON_333 <- filter(Epilabidocera_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Epilabidocera_EMA_60BON_505 <- filter(Epilabidocera_EMA_60BON, MESH==505)

Epilabidocera_EMA_60BON_505 <- filter(Epilabidocera_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")

Epilabidocera_EMA_20BON <- filter(Epilabidocera_EMA, GEAR_NAME=="20BON")

Epilabidocera_EMA_20BON_153 <- filter(Epilabidocera_EMA_20BON, MESH==153)

Epilabidocera_EMA_20BON_153 <- filter(Epilabidocera_EMA_20BON_153, STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Epilabidocera_EMA_Final <- rbind(Epilabidocera_EMA_60BON_333, Epilabidocera_EMA_60BON_505, Epilabidocera_EMA_20BON_153)

ungroup(Epilabidocera_EMA_Final)

#Remove some files

rm(Epilabidocera_EMA_byGEAR_NAME, Epilabidocera_EMA_20BON, Epilabidocera_EMA_20BON_153, Epilabidocera_EMA_60BON, Epilabidocera_EMA_60BON_333, Epilabidocera_EMA_60BON_505)

#Combine into final, Epilabidocera data set

Epilabidocera <- rbind(Epilabidocera_EMA_Final, Epilabidocera_EcoDAAT)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Epilabidocera)

Eucalanus bungii


Eucalanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Eucalanus bungii")


#Separate EMA data as they were sorted under different protocols

Eucalanus_EMA <- filter(Eucalanus, DATA_SOURCE=="EMA")
Eucalanus_EcoDAAT <- filter(Eucalanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Eucalanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Eucalanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Eucalanus_EcoDAAT_FormSummary <- summarise(Eucalanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Eucalanus_EcoDAAT_A <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="A")
Eucalanus_EcoDAAT_A <- filter(Eucalanus_EcoDAAT_A, MESH!=153)

Eucalanus_EcoDAAT_B <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="B")
Eucalanus_EcoDAAT_B <- filter(Eucalanus_EcoDAAT_B, MESH!=153)

Eucalanus_EcoDAAT_C <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="C")
Eucalanus_EcoDAAT_C <- filter(Eucalanus_EcoDAAT_C, MESH==153)

Eucalanus_EcoDAAT_F <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="F")


Eucalanus_EcoDAAT_G <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="G")

Eucalanus_EcoDAAT_H <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="H")

Eucalanus_EcoDAAT_K <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="K")

Eucalanus_EcoDAAT_L <- filter(Eucalanus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Eucalanus_EcoDAAT_Final <- rbind(Eucalanus_EcoDAAT_A, Eucalanus_EcoDAAT_B, Eucalanus_EcoDAAT_C, Eucalanus_EcoDAAT_F,  Eucalanus_EcoDAAT_G, Eucalanus_EcoDAAT_H, Eucalanus_EcoDAAT_K, Eucalanus_EcoDAAT_L)

ungroup(Eucalanus_EcoDAAT_Final)

#Remove some files

rm(Eucalanus_EcoDAAT_bySPECIMEN_FORM, Eucalanus_EcoDAAT_A, Eucalanus_EcoDAAT_B, Eucalanus_EcoDAAT_C, Eucalanus_EcoDAAT_F, Eucalanus_EcoDAAT_G, Eucalanus_EcoDAAT_H, Eucalanus_EcoDAAT_K, Eucalanus_EcoDAAT_L)



#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Eucalanus_EMA_byGEAR_NAME <- group_by(Eucalanus_EMA, MESH, GEAR_NAME)

Eucalanus_EMA_GearSummary <- summarise(Eucalanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Eucalanus_EMA_60BON <- filter(Eucalanus_EMA, GEAR_NAME=="60BON")

Eucalanus_EMA_60BON_333 <- filter(Eucalanus_EMA_60BON, MESH==333)

Eucalanus_EMA_60BON_333 <- filter(Eucalanus_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Eucalanus_EMA_60BON_505 <- filter(Eucalanus_EMA_60BON, MESH==505)

Eucalanus_EMA_60BON_505 <- filter(Eucalanus_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

Eucalanus_EMA_20BON <- filter(Eucalanus_EMA, GEAR_NAME=="20BON")

Eucalanus_EMA_20BON_153 <- filter(Eucalanus_EMA_20BON, MESH==153)

Eucalanus_EMA_20BON_153 <- filter(Eucalanus_EMA_20BON_153, STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Eucalanus_EMA_Final <- rbind(Eucalanus_EMA_60BON_333, Eucalanus_EMA_60BON_505, Eucalanus_EMA_20BON_153)

ungroup(Eucalanus_EMA_Final)

#Remove some files

rm(Eucalanus_EMA_byGEAR_NAME, Eucalanus_EMA_20BON, Eucalanus_EMA_20BON_153, Eucalanus_EMA_60BON, Eucalanus_EMA_60BON_333, Eucalanus_EMA_60BON_505)

#Combine into final, Eucalanus data set

Eucalanus <- rbind(Eucalanus_EMA_Final, Eucalanus_EcoDAAT_Final)


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Eucalanus)

Euphausiacea pacifica


E_pacifica <- filter(NBS_Zoop_Process, TAXA_COARSE=="Euphausia pacifica")

#Filter for large net only and stages are adult and juvenile

E_pacifica <- filter(E_pacifica, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, E_pacifica)

Euphausiacea


Euphausiacea <- filter(NBS_Zoop_Process, TAXA_COARSE=="Euphausiacea")

#First separate out the adults belonging to Tessarbranchion oculatum

    
Tessarabrachion_oculatum <- filter (Euphausiacea, TAXON_NAME=="Tessarabrachion oculatum")


#Now filter the Euphausiacea for the correct stages and nets

Euphausiacea <- filter(Euphausiacea, TAXON_NAME!="Tessarabrachion oculatum")

#Eliminate adult and juvenile stages, those should be identified to species

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!= "A + J (ADULT/JUVENILE)")

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!= "JUVENILE")

#Get rid of the NOT DETERMINED

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!="NOT DETERMINED")

#Get rid of the EGG

Euphausiacea <- filter(Euphausiacea, STAGE_NAME!="EGG")


#Now create the furcilia dataset

Euphausiacea_furcilia <- filter(Euphausiacea, STAGE_NAME=="FURCILIA")

Euphausiacea_furcilia <- filter(Euphausiacea, GEAR_NAME=="60BON")


#Now create the calytopis dataset

Euphausiacea_calyptopis <- filter(Euphausiacea, STAGE_NAME=="CALYPTOPIS (STAGE NOT DETERMINED)"|STAGE_NAME=="CALYPTOPIS 1"|STAGE_NAME=="CALYPTOPIS 2"|STAGE_NAME=="CALYPTOPIS 3")


#Now create the nauplius dataset

Euphausiacea_nauplius <- filter(Euphausiacea, STAGE_NAME=="NAUPLIUS")

#Filter for small nets only

Euphausiacea_nauplius <- filter(Euphausiacea_nauplius, GEAR_NAME!="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Euphausiacea_furcilia, Euphausiacea_calyptopis, Euphausiacea_nauplius)

Eurytemora spp.


Eurytemora <- filter(NBS_Zoop_Process, TAXA_COARSE=="Eurytemora spp.")

#Filter from the small nets only

Eurytemora <- filter(Eurytemora, GEAR_NAME!="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Eurytemora)

Gastropoda


Gastropoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Gastropoda")

#Unidentified gastropods, can remove from final dataset

Limacina helicina


Limacina <- filter(NBS_Zoop_Process, TAXA_COARSE=="Limacina helicina")

#Can split into estiamtes from large and small nets


Limacina_large <- filter(Limacina, GEAR_NAME=="60BON")

#Rename the coarse taxa

Limacina_large$TAXA_COARSE[Limacina_large$TAXA_COARSE=="Limacina helicina"] <- "Limacina_large"

#Now do the small nets

Limacina_small <- filter(Limacina, GEAR_NAME!="60BON")

#Rename the coarse taxa

Limacina_small$TAXA_COARSE[Limacina_small$TAXA_COARSE=="Limacina helicina"] <- "Limacina_small"


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Limacina_large, Limacina_small)

Metridia longa


Metridia_longa <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia longa")

#Adults, C5 only so all is good, can add to full data set

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_longa)

Metridia okhotensis


Metridia_okhotensis <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia okhotensis")


#Adults, C4, and C5 only so all is good, can add to full data set

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_okhotensis)

Metridia pacifica


Metridia_pacifica <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia pacifica")


#Separate EMA data as they were sorted under different protocols

Metridia_pacifica_EMA <- filter(Metridia_pacifica, DATA_SOURCE=="EMA")
Metridia_pacifica_EcoDAAT <- filter(Metridia_pacifica, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Metridia_pacifica_EcoDAAT_bySPECIMEN_FORM <- group_by(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Metridia_pacifica_EcoDAAT_FormSummary <- summarise(Metridia_pacifica_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Metridia_pacifica_EcoDAAT_B <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="B")
Metridia_pacifica_EcoDAAT_B <- filter(Metridia_pacifica_EcoDAAT_B, MESH!=153)

Metridia_pacifica_EcoDAAT_C <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="C")

Metridia_pacifica_EcoDAAT_G <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="G")


Metridia_pacifica_EcoDAAT_H <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="H")

#Remove C3 stage

Metridia_pacifica_EcoDAAT_H <- filter(Metridia_pacifica_EcoDAAT_H, STAGE_NAME!="C - 3 (COPEPODITE III)")


Metridia_pacifica_EcoDAAT_K <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="K")

Metridia_pacifica_EcoDAAT_L <- filter(Metridia_pacifica_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Metridia_pacifica_EcoDAAT_Final <- rbind(Metridia_pacifica_EcoDAAT_B, Metridia_pacifica_EcoDAAT_C, Metridia_pacifica_EcoDAAT_G, Metridia_pacifica_EcoDAAT_H, Metridia_pacifica_EcoDAAT_K, Metridia_pacifica_EcoDAAT_L)

ungroup(Metridia_pacifica_EcoDAAT_Final)

#Remove some files

rm(Metridia_pacifica_EcoDAAT_bySPECIMEN_FORM, Metridia_pacifica_EcoDAAT_B, Metridia_pacifica_EcoDAAT_C, Metridia_pacifica_EcoDAAT_G, Metridia_pacifica_EcoDAAT_H, Metridia_pacifica_EcoDAAT_K, Metridia_pacifica_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Metridia_pacifica_EMA_byGEAR_NAME <- group_by(Metridia_pacifica_EMA, MESH, GEAR_NAME)

Metridia_pacifica_EMA_GearSummary <- summarise(Metridia_pacifica_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Metridia_pacifica_EMA_60BON <- filter(Metridia_pacifica_EMA, GEAR_NAME=="60BON")

Metridia_pacifica_EMA_60BON_333 <- filter(Metridia_pacifica_EMA_60BON, MESH==333)

Metridia_pacifica_EMA_60BON_333 <- filter(Metridia_pacifica_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")

Metridia_pacifica_EMA_60BON_505 <- filter(Metridia_pacifica_EMA_60BON, MESH==505)

Metridia_pacifica_EMA_60BON_505 <- filter(Metridia_pacifica_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)")



Metridia_pacifica_EMA_smallnets <- filter(Metridia_pacifica_EMA, GEAR_NAME!="60BON")

Metridia_pacifica_EMA_smallnets <- filter(Metridia_pacifica_EMA_smallnets, STAGE_NAME=="C - 1 (COPEPODITE I)"|STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 3 (COPEPODITE III)")

#Rename Metridia pacific of early stages as Metridia spp.

Metridia_pacifica_EMA_smallnets$TAXA_COARSE[Metridia_pacifica_EMA_smallnets$TAXA_COARSE=="Metridia pacifica"] <- "Metridia spp."

#The other gears are correct, so rebuild dataset

Metridia_pacifica_EMA_Final <- rbind(Metridia_pacifica_EMA_60BON_333, Metridia_pacifica_EMA_60BON_505, Metridia_pacifica_EMA_smallnets)

ungroup(Metridia_pacifica_EMA_Final)

#Remove some files

rm(Metridia_pacifica_EMA_byGEAR_NAME, Metridia_pacifica_EMA_smallnets, Metridia_pacifica_EMA_60BON, Metridia_pacifica_EMA_60BON_333, Metridia_pacifica_EMA_60BON_505)

#Combine into final, Metridia_pacifica data set

Metridia_pacifica <- rbind(Metridia_pacifica_EMA_Final, Metridia_pacifica_EcoDAAT_Final)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_pacifica)

Metridia spp.


Metridia_spp <- filter(NBS_Zoop_Process, TAXA_COARSE=="Metridia spp.")

#Filter for the small nets only

Metridia_spp <- filter(Metridia_spp, GEAR_NAME!="60BON")

#Now filter out the stages that are accurate for the small nets, anything less than stage C-3

Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C-1 TO C-5")
Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C3-4")
Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C3-5")
Metridia_spp <- filter(Metridia_spp, STAGE_NAME!= "C - 4 (COPEPODITE IV)")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Metridia_spp)

Mysids


Mysidae <- filter(NBS_Zoop_Process, TAXA_COARSE=="Mysidae")

#Filter for 60BON nets only

Mysidae <- filter(Mysidae, GEAR_NAME=="60BON")


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Mysidae)

Neocalanus cristatus


Cristatus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Neocalanus cristatus")


#Separate EMA data as they were sorted under different protocols

Cristatus_EMA <- filter(Cristatus, DATA_SOURCE=="EMA")
Cristatus_EcoDAAT <- filter(Cristatus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Cristatus_EcoDAAT_bySPECIMEN_FORM <- group_by(Cristatus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Cristatus_EcoDAAT_FormSummary <- summarise(Cristatus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Cristatus_EcoDAAT_A <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="A")
Cristatus_EcoDAAT_A <- filter(Cristatus_EcoDAAT_A, MESH!=153)

Cristatus_EcoDAAT_B <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="B")
Cristatus_EcoDAAT_B <- filter(Cristatus_EcoDAAT_B, MESH!=153)

Cristatus_EcoDAAT_C <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="C")
Cristatus_EcoDAAT_C <- filter(Cristatus_EcoDAAT_C, MESH==153)
Cristatus_EcoDAAT_C <- filter(Cristatus_EcoDAAT_C, GEAR_NAME=="20BON")

Cristatus_EcoDAAT_F <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="F")

Cristatus_EcoDAAT_G <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="G")

Cristatus_EcoDAAT_H <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="H")

Cristatus_EcoDAAT_K <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="K")

Cristatus_EcoDAAT_L <- filter(Cristatus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Cristatus_EcoDAAT_Final <- rbind(Cristatus_EcoDAAT_A, Cristatus_EcoDAAT_B, Cristatus_EcoDAAT_C, Cristatus_EcoDAAT_F, Cristatus_EcoDAAT_G, Cristatus_EcoDAAT_H, Cristatus_EcoDAAT_K, Cristatus_EcoDAAT_L)

ungroup(Cristatus_EcoDAAT_Final)

#Remove some files

rm(Cristatus_EcoDAAT_bySPECIMEN_FORM, Cristatus_EcoDAAT_A, Cristatus_EcoDAAT_B, Cristatus_EcoDAAT_C, Cristatus_EcoDAAT_F, Cristatus_EcoDAAT_G, Cristatus_EcoDAAT_H, Cristatus_EcoDAAT_K, Cristatus_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Cristatus_EMA_byGEAR_NAME <- group_by(Cristatus_EMA, MESH, GEAR_NAME)

Cristatus_EMA_GearSummary <- summarise(Cristatus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Cristatus_EMA_Final <-  filter(Cristatus_EMA, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")


ungroup(Cristatus_EMA_Final)


#Now combine EMA and EcoDAAT data together

Cristatus_Final <- rbind(Cristatus_EMA_Final, Cristatus_EcoDAAT_Final)


#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Cristatus_Final)

Neocalanus spp.


Neocalanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Neocalanus spp.")


#Separate EMA data as they were sorted under different protocols

Neocalanus_EMA <- filter(Neocalanus, DATA_SOURCE=="EMA")
Neocalanus_EcoDAAT <- filter(Neocalanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Neocalanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Neocalanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Neocalanus_EcoDAAT_FormSummary <- summarise(Neocalanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#Do some filtering to get the correct stages from the correct gear for EcoDAAT data

Neocalanus_EcoDAAT_B <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="B")
Neocalanus_EcoDAAT_B <- filter(Neocalanus_EcoDAAT_B, MESH!=153)

Neocalanus_EcoDAAT_C <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="C")
Neocalanus_EcoDAAT_C <- filter(Neocalanus_EcoDAAT_C, MESH==153)
Neocalanus_EcoDAAT_C <- filter(Neocalanus_EcoDAAT_C, GEAR_NAME=="20BON")

Neocalanus_EcoDAAT_G <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="G")

Neocalanus_EcoDAAT_H <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="H")

Neocalanus_EcoDAAT_K <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="K")

Neocalanus_EcoDAAT_L <- filter(Neocalanus_EcoDAAT, SPECIMEN_FORM=="L")

#The other gears are correct, so rebuild dataset

Neocalanus_EcoDAAT_Final <- rbind(Neocalanus_EcoDAAT_B, Neocalanus_EcoDAAT_C, Neocalanus_EcoDAAT_G, Neocalanus_EcoDAAT_H, Neocalanus_EcoDAAT_K, Neocalanus_EcoDAAT_L)

ungroup(Neocalanus_EcoDAAT_Final)

#Remove some files

rm(Neocalanus_EcoDAAT_bySPECIMEN_FORM, Neocalanus_EcoDAAT_B, Neocalanus_EcoDAAT_C, Neocalanus_EcoDAAT_G, Neocalanus_EcoDAAT_H, Neocalanus_EcoDAAT_K, Neocalanus_EcoDAAT_L)

#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Neocalanus_EMA_byGEAR_NAME <- group_by(Neocalanus_EMA, MESH, GEAR_NAME)

Neocalanus_EMA_GearSummary <- summarise(Neocalanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Neocalanus_EMA_Final <-  filter(Neocalanus_EMA, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)"|STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)")


ungroup(Neocalanus_EMA_Final)


#NOw combine EMA and EcoDAAT data together

Neocalanus_Final <- rbind(Neocalanus_EMA_Final, Neocalanus_EcoDAAT_Final)

#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Neocalanus_Final)

Oithona spp.


Oithona <- filter(NBS_Zoop_Process, TAXA_COARSE=="Oithona spp.")

#Filter for small nets only

Oithona <- filter(Oithona, GEAR_NAME!="60BON")


#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Oithona)

Ostracoda


Ostracoda <- filter(NBS_Zoop_Process, TAXA_COARSE=="Ostracoda")

Polychaeta


Polychaeta <- filter(NBS_Zoop_Process, TAXA_COARSE=="Polychaeta")

#Split into small and large estimates from the correct nets and meshes

Polychaeta_large <- filter(Polychaeta, GEAR_NAME=="60BON")


#Rename Polychaeta large

Polychaeta_large$TAXA_COARSE[Polychaeta_large$TAXA_COARSE=="Polychaeta"] <- "Polychaeta_large"


#Now do the small nets

Polychaeta_small <- filter(Polychaeta, GEAR_NAME!="60BON")

#Rename Polychaeta small

Polychaeta_small$TAXA_COARSE[Polychaeta_small$TAXA_COARSE=="Polychaeta"] <- "Polychaeta_small"


#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Polychaeta_large, Polychaeta_small)

Pseudocalanus


Pseudocalanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Pseudocalanus spp.")

#Filter for the small nets only

Pseudocalanus <- filter(Pseudocalanus, GEAR_NAME!="60BON")


#Add to final dataset


NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Pseudocalanus)

Thaliacea


Thaliacea <- filter(NBS_Zoop_Process, TAXA_COARSE=="Thaliacea")

Themisto abyssorum


Themisto_abyssorum <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto abyssorum")

Themisto libellula


Themisto_libellula <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto libellula")

#Filter for the 60BON nets only

Themisto_libellula <- filter(Themisto_libellula, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Themisto_libellula)

Themisto pacifica


Themisto_pacifica <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto pacifica")

#Filter for the 60BON nets only

Themisto_pacifica <- filter(Themisto_pacifica, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Themisto_pacifica)

Themisto spp.


Themisto <- filter(NBS_Zoop_Process, TAXA_COARSE=="Themisto spp.")

#Filter for the 60BON nets only

Themisto<- filter(Themisto, GEAR_NAME=="60BON")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Themisto)

Thysanoessa species


Thysanoessa <- filter(NBS_Zoop_Process, TAXA_COARSE=="Thysanoessa inermis"|TAXA_COARSE=="Thysanoessa inspinata"|TAXA_COARSE=="Thysanoessa longipes"|TAXA_COARSE=="Thysanoessa raschii"|TAXA_COARSE=="Thysanoessa spinifera")

#Select for 60BON only

Thysanoessa <- filter(Thysanoessa, GEAR_NAME=="60BON")

#Now the correct stages

Thysanoessa <- filter(Thysanoessa, STAGE_NAME=="A + J (ADULT/JUVENILE)"|STAGE_NAME=="JUVENILE"|STAGE_NAME=="ADULT")

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Thysanoessa)

Tortanus discaudatus


Tortanus <- filter(NBS_Zoop_Process, TAXA_COARSE=="Tortanus discaudatus")

#Separate EMA data as they were sorted under different protocols

Tortanus_EMA <- filter(Tortanus, DATA_SOURCE=="EMA")
Tortanus_EcoDAAT <- filter(Tortanus, DATA_SOURCE=="EcoDAAT")

#Check to see if right stages are in the EcoDAAT data

Tortanus_EcoDAAT_bySPECIMEN_FORM <- group_by(Tortanus_EcoDAAT, SPECIMEN_FORM, MESH, GEAR_NAME)

Tortanus_EcoDAAT_FormSummary <- summarise(Tortanus_EcoDAAT_bySPECIMEN_FORM,n())
`summarise()` has grouped output by 'SPECIMEN_FORM', 'MESH'. You can override using
the `.groups` argument.
#EcoDAAT data are correctly specified



#Now filter the EMA data to match the EcoDAAT data. EMA tends to double count variables from both nets, so eliminate this

#Check to see if what stages are where with EMA data

Tortanus_EMA_byGEAR_NAME <- group_by(Tortanus_EMA, MESH, GEAR_NAME)

Tortanus_EMA_GearSummary <- summarise(Tortanus_EMA_byGEAR_NAME, n())
`summarise()` has grouped output by 'MESH'. You can override using the `.groups`
argument.
#No issues with mismatched mesh and gear sizes. Need to filter for the correct stages for avoid double counts

Tortanus_EMA_60BON <- filter(Tortanus_EMA, GEAR_NAME=="60BON")

Tortanus_EMA_60BON_333 <- filter(Tortanus_EMA_60BON, MESH==333)

Tortanus_EMA_60BON_333 <- filter(Tortanus_EMA_60BON_333, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)")

Tortanus_EMA_60BON_505 <- filter(Tortanus_EMA_60BON, MESH==505)

Tortanus_EMA_60BON_505 <- filter(Tortanus_EMA_60BON_505, STAGE_NAME=="ADULT"|STAGE_NAME=="C - 5 (COPEPODITE V)")



Tortanus_EMA_smallnets <- filter(Tortanus_EMA, GEAR_NAME!="60BON")


Tortanus_EMA_smallnets <- filter(Tortanus_EMA_smallnets, STAGE_NAME=="C - 4 (COPEPODITE IV)"|STAGE_NAME=="C - 3 (COPEPODITE III)"|STAGE_NAME=="C - 2 (COPEPODITE II)"|STAGE_NAME=="C - 1 (COPEPODITE I)")

#The other gears are correct, so rebuild dataset

Tortanus_EMA_Final <- rbind(Tortanus_EMA_60BON_333, Tortanus_EMA_60BON_505, Tortanus_EMA_smallnets)

ungroup(Tortanus_EMA_Final)

#Remove some files

rm(Tortanus_EMA_byGEAR_NAME,  Tortanus_EMA_smallnets, Tortanus_EMA_60BON, Tortanus_EMA_60BON_333, Tortanus_EMA_60BON_505)

#Combine into final, Tortanus data set

Tortanus <- rbind(Tortanus_EMA_Final, Tortanus_EcoDAAT)

#Add to final dataset

NBS_Zoop_Process_Final <- rbind (NBS_Zoop_Process_Final, Tortanus)

Now do biomass conversions


#NOw read in the biomass conversion data set

Biomass_annotated <- read_xlsx(here("data", "Biomass", "Biomass-Annotated.xlsx"))

#Merge the two data sets based on TAXA_COARSE, STAGE_NAME, SEX_NAME

NBS_Zoop_Process_Final <- left_join(NBS_Zoop_Process_Final, Biomass_annotated, by = c("TAXA_COARSE", "STAGE_NAME", "SEX_NAME"))

#Do some tidying to eliminate some columns

NBS_Zoop_Process_Final$NOTE <- NULL
NBS_Zoop_Process_Final$IND_WW_MG_NOTE <- NULL
NBS_Zoop_Process_Final$IND_DW_MG_CONVERTED_NOTE <- NULL
NBS_Zoop_Process_Final$IND_C_MG_CONVERTED_NOTE <- NULL
NBS_Zoop_Process_Final$GROWTH_RATE_NOTE <- NULL

#Create wet weight biomass column converted individual wet weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_WW_MG_M3_MEAN = IND_WW_MG_MEASURED_MEAN*EST_NUM_PERM3)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_WW_MG_M3_SD = IND_WW_MG_MEASURED_SD*EST_NUM_PERM3)

#Create dry weight biomass column converted individual dry weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_DW_MG_M3_MEAN = IND_DW_MG_CONVERTED_MEAN*EST_NUM_PERM3)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_DW_MG_M3_SD = IND_DW_MG_CONVERTED_SD*EST_NUM_PERM3)

#Create carbon weight biomass column converted individual carbon weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_C_MG_M3_MEAN = IND_C_MG_CONVERTED_MEAN*EST_NUM_PERM3)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, BIOMASS_C_MG_M3_SD = IND_C_MG_CONVERTED_SD*EST_NUM_PERM3)


#Create carbon weight biomass column converted individual carbon weight and abundance

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, PRODUCTION_MG_C_D_MEAN = (IND_C_MG_CONVERTED_MEAN*EST_NUM_PERM3*GROWTH_RATE_MEAN)*24)

NBS_Zoop_Process_Final <- mutate(NBS_Zoop_Process_Final, PRODUCTION_MG_C_D_SD = (IND_C_MG_CONVERTED_SD*EST_NUM_PERM3*GROWTH_RATE_SD)*24)
new_zoop <- read.csv("data/AllZoop_Raw_26JUL2024.csv") %>% 
             filter(YEAR> 2019,
                    !LAT<55.0473,
                    !LAT>66.1) 

Compare 2019 between both datasets to check

new_zoop_2019 <- read.csv("data/AllZoop_Raw_26JUL2024.csv") %>% 
             filter(YEAR %in% c(2017,2018, 2019),
                    TAXON_NAME == "Calanus marshallae",
                    !LAT<55.0473,
                    !LAT>66.1)  
  
summ_NEW_NBS <- new_zoop_2019 %>% 
    group_by(CRUISE,HAUL_ID,YEAR,MONTH,DAY,LAT,LON, DATA_SOURCE,TAXON_NAME) %>% # sum across life stages 
    dplyr::summarise(EST_NUM_PERM3 =  sum(EST_NUM_PERM3)) %>%
    filter(!LAT<58,
           !LAT>65,
           !LON> -155,
           !LON< -172,
           MONTH %in% c(7,8,9,10)) %>% 
    unite("date", c(YEAR, MONTH, DAY), sep = "/", remove = FALSE) %>%
    dplyr::mutate(date = as.Date(date, "%Y/%m/%d"),
                  DOY = yday(date),
                  TAXA_COARSE = case_when(grepl(pattern = "Themisto", x=TAXON_NAME, ignore.case = TRUE) ~ "large_zoop",
                                          grepl(pattern = "Calanus", x=TAXON_NAME, ignore.case = TRUE) ~ "large_zoop",
                                          grepl(pattern = "Copepod_large", x=TAXON_NAME, ignore.case = TRUE) ~ "large_zoop",
                                          grepl(pattern = "Neocalanus", x=TAXON_NAME, ignore.case = TRUE) ~ "large_zoop",
                                          
                                          grepl(pattern = "Cnidaria_small", x=TAXON_NAME, ignore.case = TRUE) ~ "Cnideria",
                                          grepl(pattern = "Cnidaria_large", x=TAXON_NAME, ignore.case = TRUE) ~ "Cnideria",
                                              TRUE ~ "other")) %>% 
    group_by(DATA_SOURCE,YEAR, DOY,LAT,LON) %>% # sum across species 
  dplyr::summarise(sum_EST_NUM_PERM3 = sum(EST_NUM_PERM3))  %>% 
  dplyr::mutate(YEAR = as.factor(YEAR),
         DATA_SOURCE = as.factor(DATA_SOURCE)) %>% 
  data.frame() %>% 
  group_by(YEAR) %>% 
  dplyr::summarise(mean = mean(sum_EST_NUM_PERM3))

NBS_all_2019 <- NBS_Zoop_Process_Final %>% 
             filter(YEAR== 2019,
                    TAXON_NAME == "Calanus marshallae") 



 summ_NBS <- NBS_all_2019 %>% 
    group_by(CRUISE,HAUL_ID,YEAR,MONTH,DAY,LAT,LON, DATA_SOURCE,TAXON_NAME) %>% # sum across life stages 
    dplyr::summarise(EST_NUM_PERM3 =  sum(EST_NUM_PERM3)) %>%
    filter(!LAT<58,
           !LAT>65,
           !LON> -155,
           !LON< -172,
           MONTH %in% c(7,8,9,10)) %>% 
    unite("date", c(YEAR, MONTH, DAY), sep = "/", remove = FALSE) %>%
    dplyr::mutate(date = as.Date(date, "%Y/%m/%d"),
                  DOY = yday(date),
                  TAXA_COARSE = case_when(grepl(pattern = "Themisto", x=TAXON_NAME, ignore.case = TRUE) ~ "large_zoop",
                                          grepl(pattern = "Calanus", x=TAXON_NAME, ignore.case = TRUE) ~ "large_zoop",
                                          grepl(pattern = "Copepod_large", x=TAXON_NAME, ignore.case = TRUE) ~ "large_zoop",
                                          grepl(pattern = "Neocalanus", x=TAXON_NAME, ignore.case = TRUE) ~ "large_zoop",
                                          
                                          grepl(pattern = "Cnidaria_small", x=TAXON_NAME, ignore.case = TRUE) ~ "Cnideria",
                                          grepl(pattern = "Cnidaria_large", x=TAXON_NAME, ignore.case = TRUE) ~ "Cnideria",
                                              TRUE ~ "other")) %>% 
    group_by(DATA_SOURCE,YEAR, DOY,LAT,LON) %>% # sum across species 
  dplyr::summarise(sum_EST_NUM_PERM3 = sum(EST_NUM_PERM3))  %>% 
  mutate(YEAR = as.factor(YEAR),
         DATA_SOURCE = as.factor(DATA_SOURCE)) %>% 
  data.frame()

Combine the two

combo <- rbind(new_zoop %>% 
                 dplyr::select(CRUISE, DAY, GEAR_NAME, HAUL_ID,LAT,LON,DATA_SOURCE,
                               STAGE_NAME,TAXON_NAME, YEAR,MONTH,EST_NUM_PERM3),
               NBS_Zoop_Process_Final %>% 
                 dplyr::select(CRUISE, DAY, GEAR_NAME, HAUL_ID,LAT,LON,DATA_SOURCE,
                               STAGE_NAME,TAXON_NAME,YEAR,MONTH,EST_NUM_PERM3))
write.csv(combo, here("data", "Processed_Data", "NBS_Zoop_Process_Final.csv"), row.names = FALSE)
LS0tCnRpdGxlOiAiQlAgU3ludGhlc2lzIERhdGEgU2V0IENvbnN0cnVjdGlvbiIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKLSBESyBjcmVhdGVkIHRoaXMgc2NyaXB0IHRvIGNvbWJpbmUgb2xkZXIgRWNvZGFhdCBhbmQgRU1BIGRhdGEsIGZvciBuZXdlciBkYXRhLCB0aGVzZSBzdGVwcyBhcmUgZG9uZSBiZWZvcmUgdGhleSBnbyBpbnRvIHRoZSBkYXRhYmFzZS4KLSBTTywgSSBhbSBqdXN0IGdvaW5nIHRvIGtlZXAgdGhlIG9sZCBkYXRhIGFuZCBjdXQgb24gdG9wIHRoZSBuZXcgZGF0YS4gCgpgYGB7cn0KbGlicmFyeShoZXJlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZWFkeGwpCiMgIlJPREJDIiwgImhlcmUiLCAicm5hdHVyYWxlYXJ0aCIsICJybmF0dXJhbGVhcnRoZGF0YSIsICJtYXBzIiwgIm1hcGRhdGEiLCAibWFybWFwIiwgInJnZGFsIikKIAoKYGBgCgpSZWFkIGluIHRoZSBFTUEgZGF0YSBmaWxlcwoKYGBge3J9CgpCQVNJU19ab29fMTk5OV8yMDA0IDwtIHJlYWRfeGxzeChoZXJlKCAiZGF0YSIsICJSYXctRGF0YSIsICJFTUEtSGlzdG9yaWNhbC1EYXRhIiwgIkJBU0lTX1pvb18xOTk5XzIwMDQueGxzeCIpLCBjb2xfdHlwZXMgPSBjKCJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJkYXRlIiwgImRhdGUiLCAiZGF0ZSIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIikpCgoKQkFTSVNfWm9vXzIwMDVfMjAwOSA8LSByZWFkX3hsc3ggKGhlcmUoImRhdGEiLCAiUmF3LURhdGEiLCAiRU1BLUhpc3RvcmljYWwtRGF0YSIsICJCQVNJU19ab29fMjAwNV8yMDA5Lnhsc3giKSwgY29sX3R5cGVzID0gYygidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAiZGF0ZSIsICJkYXRlIiwgImRhdGUiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpKQoKQkFTSVNfWm9vXzIwMTBfMjAxMyA8LSByZWFkX3hsc3ggKGhlcmUoImRhdGEiLCAiUmF3LURhdGEiLCAiRU1BLUhpc3RvcmljYWwtRGF0YSIsICJCQVNJU19ab29fMjAxMF8yMDEzLnhsc3giKSwgY29sX3R5cGVzID0gYygidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAiZGF0ZSIsICJkYXRlIiwgImRhdGUiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpKQoKQkFTSVNfWm9vXzIwMTRfMjAxNyA8LSByZWFkX3hsc3ggKGhlcmUoImRhdGEiLCAiUmF3LURhdGEiLCAiRU1BLUhpc3RvcmljYWwtRGF0YSIsICJCQVNJU19ab29fMjAxNF8yMDE3X0xvbkNvcnJlY3RlZC54bHN4IiksIGNvbF90eXBlcyA9IGMoInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgImRhdGUiLCAiZGF0ZSIsICJkYXRlIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiKSkKCkVNQV9Db21iaW5lZCA8LSByYmluZChCQVNJU19ab29fMTk5OV8yMDA0LCBCQVNJU19ab29fMjAwNV8yMDA5LCBCQVNJU19ab29fMjAxMF8yMDEzLCBCQVNJU19ab29fMjAxNF8yMDE3KQoKcm0oQkFTSVNfWm9vXzE5OTlfMjAwNCwgQkFTSVNfWm9vXzIwMDVfMjAwOSwgQkFTSVNfWm9vXzIwMTBfMjAxMywgQkFTSVNfWm9vXzIwMTRfMjAxNykKCmBgYAoKCgpDb252ZXJ0IEVNQSBmaWVsZHMgaW50byBFY29EQUFUIGZpZWxkcwoKYGBge3J9CgojQ3JlYXRlIERBWSwgTU9OVEgsIFlFQVIgY29sdW1ucyBmcm9tICJIYXVsRGF0ZSIKCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gIEVNQV9Db21iaW5lZAogCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gc2VwYXJhdGUoRU1BX0NvbWJpbmVkX1JlY29kZSwgSGF1bERhdGUsIGMoIllFQVIiLCAiTU9OVEgiLCAiREFZIiksIHNlcD0iLSIpCgojRGVsZXRlIHllYXIgY29sdW1uIGZyb20gdGhlIEhhdWxJRCBhcyB0aGVyZSBpcyBhbHJlYWR5IGEgeWVhciBjb2x1bW4KCkVNQV9Db21iaW5lZF9SZWNvZGUkWUVBUiA8LSBOVUxMCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIFlFQVIgPSBZZWFyKQoKCiNFeHRyYWN0IENydWlzZSBjb2RlIApFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA8LSBzdWJzdHJpbmcgKEVNQV9Db21iaW5lZF9SZWNvZGUkU3RhdGlvbklELCA1LDYpCgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRV9JRCA8LSBzdWJzdHJpbmcgKEVNQV9Db21iaW5lZF9SZWNvZGUkU3RhdGlvbklELCA3LDgpCgojUmVjb2QgQ3J1aXNlIGNvZGUgd2l0aCBzaGlwIElEIGFuZCAKCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwMSJdIDwtICJTUyIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjAyIl0gPC0gIk5XRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjAzIl0gPC0gIkRZIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMDQiXSA8LSAiR1AiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwNSJdIDwtICJFRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjA2Il0gPC0gIkhFIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMDciXSA8LSAiTFUiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIwOCJdIDwtICJCRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjA5Il0gPC0gIkFFIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMTAiXSA8LSAiSkMiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxMSJdIDwtICJTVCIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjEyIl0gPC0gIkNIIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMTMiXSA8LSAiU0EiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFID09ICIxNCJdIDwtICJRVSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UgPT0gIjE1Il0gPC0gIkNGIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRSA9PSAiMTYiXSA8LSAiT1MiCgojR2V0IGxhc3QgdHdvIGRpZ2l0cyBvZiB5ZWFyCgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRV9ZRUFSIDwtIHN1YnN0cmluZyAoRU1BX0NvbWJpbmVkX1JlY29kZSRZRUFSLCAzLDQpCgojQ29tYmluZWQgQ1JVSVNFIHdpdGggCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHVuaXRlKEVNQV9Db21iaW5lZF9SZWNvZGUsICJDUlVJU0UiLCBDUlVJU0UsIENSVUlTRV9ZRUFSLCBzZXA9IiIpCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHVuaXRlKEVNQV9Db21iaW5lZF9SZWNvZGUsICJDUlVJU0UiLCBDUlVJU0UsIENSVUlTRV9JRCwgc2VwID0gIi0iKQoKCiNDb3VudCBudW1iZXIgb2YgY3J1aXNlcyBpbiB0aGUgRU1BIGRhdGFzZXQKCkVNQV9Db21iaW5lZF9SZWNvZGVfYnlDUlVJU0UgPC0gZ3JvdXBfYnkoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFKQpFTUFfQ29tYmluZWRfUmVjb2RlX0NydWlzZUNvdW50IDwtIHN1bW1hcmlzZShFTUFfQ29tYmluZWRfUmVjb2RlX2J5Q1JVSVNFLCBuX2Rpc3RpbmN0KFlFQVIpKQoKdW5ncm91cChFTUFfQ29tYmluZWRfUmVjb2RlKQoKCiNSZWNvZGUgY3J1aXNlcyB0byBtYXRjaCBub21lbmNsYXR1cmUgY2hhbmdlIGluIDIwMTMgKGkuZS4sIDJEWTEyIGJlY29tZXMgRFkxMy0wMiBpbiAyMDEzKQoKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJCRTExLTAxIl0gPC0gIjFCRTExIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IkJFMTItMDEiXSA8LSAiMUJFMTIiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkwNy0wMiJdIDwtICIyT0QwNyIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJEWTA4LTA2Il0gPC0gIjZEWTA4IgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IkRZMDktMDUiXSA8LSAiNURZMDkiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRFkxMC0wNCJdIDwtICI0RFkxMCIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJEWTExLTA0Il0gPC0gIjREWTExIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IkRZMTItMDMiXSA8LSAiM0RZMTIiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iRUUwOS0wMSJdIDwtICIxRUUwOSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJFRTEwLTAxIl0gPC0gIjFFRTEwIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IkdQMDAtMDEiXSA8LSAiMUdQMDAiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iR1A5OS0wMSJdIDwtICIxR1A5OSIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJOV0UwNi0wMSJdIDwtICIxTlcwNiIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJTUzAyLTAxIl0gPC0gIjFTUzAyIgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDMtMDEiXSA8LSAiMVNTMDMiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iU1MwNC0wMSJdIDwtICIxU1MwNCIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJTUzA1LTAxIl0gPC0gIjFTUzA1IgpFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRVtFTUFfQ29tYmluZWRfUmVjb2RlJENSVUlTRT09IlNTMDYtMDEiXSA8LSAiMVNTMDYiCkVNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFW0VNQV9Db21iaW5lZF9SZWNvZGUkQ1JVSVNFPT0iU1MwNy0wMSJdIDwtICIxU1MwNyIKRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0VbRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0U9PSJOV0UxNy0wNSJdIDwtICJOVzE3LTA1IgoKI1JlbW92ZSBhIGZldyBmaWxlcwoKcm0oRU1BX0NvbWJpbmVkX1JlY29kZV9ieUNSVUlTRSwgRU1BX0NvbWJpbmVkX1JlY29kZV9DcnVpc2VDb3VudCkKCgojUmVuYW1lIEFidW5kYW5jZSB0byBFU1RfTlVNX1BFUk0zCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBFU1RfTlVNX1BFUk0zID0gQWJ1bmRhbmNlKQoKI1JlbmFtZSBHZWFyRGVwdGggdG8gTUFYX0dFQVJfREVQVEggYW5kIHVzZSB0byBjYWxjdWxhdGUgRVNUX05VTV9QRVJNMwoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgTUFYX0dFQVJfREVQVEggPSBHZWFyRGVwdGgpCgojQ29tcHV0ZSBFU1RfTlVNX1BFUk0yID0gRVNUX05VTV9QRVJNMyAqIE1BWF9HRUFSX0RFUFRICgpFTUFfQ29tYmluZWRfUmVjb2RlJEVTVF9OVU1fUEVSTTIgPC0gRU1BX0NvbWJpbmVkX1JlY29kZSRFU1RfTlVNX1BFUk0zKkVNQV9Db21iaW5lZF9SZWNvZGUkTUFYX0dFQVJfREVQVEgKCiNDcmVhdGUgY29sdW1ucyBHRUFSX05BTUUsIE1FU0ggZnJvbSBHZWFyQ29kZSBjb2x1bW4KCkVNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGVbRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZSA9PSAiQm9uZ28xNTMiXSA8LSAiMjBCT05fMTUzIgpFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlW0VNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGUgPT0gIkJvbmdvMzMzIl0gPC0gIjYwQk9OXzMzMyIKRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZVtFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlID09ICJCb25nbzUwNSJdIDwtICI2MEJPTl81MDUiCkVNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGVbRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZSA9PSAiQm9uZ284MCJdIDwtICI4MEJPTl8xNTMiCkVNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGVbRU1BX0NvbWJpbmVkX1JlY29kZSRHZWFyQ29kZSA9PSAiSnVkYXkiXSA8LSAiSnVkYXlfMTY4IgpFTUFfQ29tYmluZWRfUmVjb2RlJEdlYXJDb2RlW0VNQV9Db21iaW5lZF9SZWNvZGUkR2VhckNvZGUgPT0gIlBhaXJvVkVUIl0gPC0gIlBhaXJvVkVUXzE1MyIKCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gc2VwYXJhdGUoRU1BX0NvbWJpbmVkX1JlY29kZSwgR2VhckNvZGUsIGMoIkdFQVJfTkFNRSIsICJNRVNIIiksIHNlcCA9ICJfIikKCiNSZW5hbWUgR2VhckluVGltZSB0byBHTVRfREFURV9USU1FX1RYVAoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgR01UX0RBVEVfVElNRV9UWFQgPSBHZWFySW5UaW1lKQogIAojUmVuYW1lIFF1YWxpdHkgdG8gSEFVTF9QRVJGT1JNQU5DRSBhbmQgcmVjb2RlIHRvIG1hdGNoIEVjb0RBQVQgCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBIQVVMX1BFUkZPUk1BTkNFID0gUXVhbGl0eSkKCkVNQV9Db21iaW5lZF9SZWNvZGUkSEFVTF9QRVJGT1JNQU5DRVtFTUFfQ29tYmluZWRfUmVjb2RlJEhBVUxfUEVSRk9STUFOQ0UgPT0gIkciXSA8LSAiR09PRCIKRU1BX0NvbWJpbmVkX1JlY29kZSRIQVVMX1BFUkZPUk1BTkNFW0VNQV9Db21iaW5lZF9SZWNvZGUkSEFVTF9QRVJGT1JNQU5DRSA9PSAiUSJdIDwtICJRVUVTVCIKCiNDcmVhdGUgTEFUIGFuZCBMT04gY29sdW1uIGZyb20gR2VhckluTGF0aXR1ZGUgYW5kIEdlYXIgaW4gTG9uZ2l0dWRlCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBMQVQgPSBHZWFySW5MYXRpdHVkZSkKCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gcmVuYW1lKEVNQV9Db21iaW5lZF9SZWNvZGUsIExPTiA9IEdlYXJJbkxvbmdpdHVkZSkKCiNDcmVhdGUgY29sdW1uIFNFWF9OQU1FIGZyb20gU2V4IGFuZCByZWNvZGUgdG8gbWF0Y2ggRWNvREFBVCBjYXRlZ29yaWVzCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBTRVhfTkFNRSA9IFNleCkKCkVNQV9Db21iaW5lZF9SZWNvZGUkU0VYX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTRVhfTkFNRSA9PSAiTSJdIDwtICJNQUxFIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNFWF9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU0VYX05BTUUgPT0gIkYiXSA8LSAiRkVNQUxFIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNFWF9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU0VYX05BTUUgPT0gIlUiXSA8LSAiTk9UIERFVEVSTUlORUQiCgojRU1BIFNpemUgY2F0ZWdvcmllcyBhcmUgbnVtZXJvdXMsIHNvIGtlZXAgdGhpcyBjb2x1bW4sIGJ1dCByZW5hbWUgYXMgU0laRV9OQU1FIGZvciBtZXJnaW5nCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBTSVpFX05BTUUgPSBTaXplKQoKI0NyZWF0ZSBTVEFHRV9OQU1FIGNhdGVnb3J5IGJ5IHJlbmFtaW5nICJTdGFnZUNvZGUiIGFuZCByZWNvZGluZwoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSByZW5hbWUoRU1BX0NvbWJpbmVkX1JlY29kZSwgU1RBR0VfTkFNRSA9IFN0YWdlQ29kZSkKCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkEiXSA8LSAiQURVTFQiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkEgJiBKIl0gPC0gIkEgKyBKIChBRFVMVC9KVVZFTklMRSkiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImFkdWx0Il0gPC0gIkFEVUxUIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJBZHVsdCJdIDwtICJBRFVMVCIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzEiXSA8LSAiQyAtIDEgKENPUEVQT0RJVEUgSSkiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkMxLTIiXSA8LSAiQy0xIFRPIEMtMiIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzEtMyJdIDwtICJDLTEgVE8gQy0zIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMS00Il0gPC0gIkMtMSBUTyBDLTQiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkMxLTUiXSA8LSAiQy0xIFRPIEMtNSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzEtQzQiXSA8LSAiQy0xIFRPIEMtNCIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiQzIiXSA8LSAiQyAtIDIgKENPUEVQT0RJVEUgSUkpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMi1DMyJdIDwtICJDLTIgVE8gQy0zIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMi1DNSJdIDwtICJDLTIgVE8gQy01IgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMyJdIDwtICJDIC0gMyAoQ09QRVBPRElURSBJSUkpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMy1DNCJdIDwtICJDLTMgVE8gQy00IgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDMy1DNSJdIDwtICJDLTMgVE8gQy01IgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDNCJdIDwtICJDIC0gNCAoQ09QRVBPRElURSBJVikiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkM0LUM1Il0gPC0gIkMtNCBUTyBDLTUiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkM0LUM2Il0gPC0gIkMtNCBUTyBDLTYiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkM1Il0gPC0gIkMgLSA1IChDT1BFUE9ESVRFIFYpIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJDNiJdIDwtICJBRFVMVCIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiY2FseXB0b3BpcyJdIDwtICJDQUxZUFRPUElTIChTVEFHRSBOT1QgREVURVJNSU5FRCkiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImNhbHlwdG9waXMgMSJdIDwtICJDQUxZUFRPUElTIChTVEFHRSBOT1QgREVURVJNSU5FRCkiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImNhbHlwdG9waXMgMiJdIDwtICJDQUxZUFRPUElTIChTVEFHRSBOT1QgREVURVJNSU5FRCkiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImNhbHlwdG9waXMgMyJdIDwtICJDQUxZUFRPUElTIChTVEFHRSBOT1QgREVURVJNSU5FRCkiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImN5cHJpcyJdIDwtICJDWVBSSVMiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkN5cHJpcyJdIDwtICJDWVBSSVMiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImVnZyJdIDwtICJFR0ciCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkVnZyJdIDwtICJFR0ciCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImZ1cmNpbGlhIl0gPC0gIkZVUkNJTElBIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJGdXJjaWxpYSJdIDwtICJGVVJDSUxJQSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiSiJdIDwtICJKVVZFTklMRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAianV2ZW5pbGUiXSA8LSAiSlVWRU5JTEUiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIkp1dmVuaWxlIl0gPC0gIkpVVkVOSUxFIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJsYXJ2YSJdIDwtICJMQVJWQSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiTGFydmEiXSA8LSAiTEFSVkEiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gImxhcnZhbCJdIDwtICJMQVJWQSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAiTGFydmFsIl0gPC0gIkxBUlZBIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJtZWR1c2EiXSA8LSAiTUVEVVNBIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJNZWR1c2EiXSA8LSAiTUVEVVNBIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJtZWdhbG9wYSJdIDwtICJNRUdBTE9QQUUiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIk1lZ2Fsb3BhIl0gPC0gIk1FR0FMT1BBRSIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAibmF1cGxpdXMiXSA8LSAiTkFVUExJVVMiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIk5hdXBsaXVzIl0gPC0gIk5BVVBMSVVTIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJORCJdIDwtICJOT1QgREVURVJNSU5FRCIKRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRSA9PSAicG9zdC1sYXJ2YSJdIDwtICJQT1NUIExBUlZBIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJVIl0gPC0gIk5PVCBERVRFUk1JTkVEIgpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRTVEFHRV9OQU1FID09ICJ6b2VhIl0gPC0gIlpPRUEiCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBR0VfTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFX05BTUUgPT0gIlpvZWEiXSA8LSAiWk9FQSIKCiNDcmVhdGUgQ29sdW1uIFNUQVRJT05fTkFNRSBieSB1c2luZyB0aGUgbGFzdCAzIGRpZ2l0cyBvZiBTdGF0aW9uSUQKCkVNQV9Db21iaW5lZF9SZWNvZGUkU1RBVElPTl9OQU1FPC0gc3Vic3RyaW5nIChFTUFfQ29tYmluZWRfUmVjb2RlJFN0YXRpb25JRCwgOSwxMSkKCiNDcmVhdGUgVEFYT05fTkFNRSBjb2x1bW4gYW5kIHJlY29kZSB0byBtYXRjaCBFY29EQUFUCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBUQVhPTl9OQU1FID0gQ3VycmVudF9OYW1lKQoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQWNhbnRob215c2lzIHNwLiJdIDwtICJBY2FudGhvbXlzaXMgc3BwLiIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkFjYW50aG9teXNpcyBzdGVsbGVyaSJdIDwtICJBY2FudGhvbXlzaXMgc3RlbGxlcmkgKEV4YWNhbnRob215c2lzIGFyY3RvcGFjaWZpY2EpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQW50aG9hdGhlY2F0YWUiXSA8LSAiQW50aG9hdGhlY2F0YSAoQW50aG9tZWR1c2FlKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNhbmNyaWRhZSJdIDwtICJDYW5jcmlkYWUgKEJyYWNoeXVyYSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDYW5kYWNpYSBjb2x1bWJpYWUiXSA8LSAiQ2FuZGFjaWEgQ29sdW1iaWFlIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQ2FwcmVsbGlkZWEiXSA8LSAiQ2FwcmVsbGlkYWUiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDbHl0aWEgZ3JlZ2FyaWEiXSA8LSAiQ2x5dGlhIGdyZWdhcmlhIChQaGlhbGlkaXVtIGdyZWdhcml1bSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDbmlkYXJpYSJdIDwtICJDbmlkYXJpYW4gbWVkdXNhZSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNvcm9waGl1bSBzcHAuIl0gPC0gIkNvcm9waGl1bSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkRpc2FjYW50aG9teXNpcyBkeWJvd3NraWkiXSA8LSAiRGlzY2FudGhvbXlzaXMgKEFjYW50aG9teXNpcykgRHlib3dza2lpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiRXBpbGFiaWRvY2VyYSBhbXBoaXRyaXRlcyJdIDwtICJFcGlsYWJpZG9jZXJhIGFtcGhpdHJpdGVzIChFLiBsb25naXBlZGF0YSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJFcGlsYWJpZG9jZXJhIGxvbmdpcGVkYXRhIl0gPC0gIkVwaWxhYmlkb2NlcmEgYW1waGl0cml0ZXMgKEUuIGxvbmdpcGVkYXRhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkV1cGhhdXNpYSBzcHAuIl0gPC0gIkV1cGhhdXNpYWNlYSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkV1cnl0ZW1vcmEgcGFjaWZpY2EiXSA8LSAiRXVyeXRlbW9yYSBwYWNpZmljYSAoRS4gam9oYW5zZW5pKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkV1cnl0ZW1vcmEgc3AuIl0gPC0gIkV1cnl0ZW1vcmEgc3BwLiIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkdhbW1hcmlkYWUiXSA8LSAiR2FtbWFyaWRlYSAoVW5pZGVudGlmaWFibGUpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiR2FtbWFyaWRlYSJdIDwtICJHYW1tYXJpZGVhIChVbmlkZW50aWZpYWJsZSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJIaXBwb2x5dGlkYWUiXSA8LSAiSGlwcG9seXRpZGFlIChDYXJpZGVhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkh5ZHJvbWVkdXNhZSAoSHlkcm9pZG9saW5hIl0gPC0gIkh5ZHJvbWVkdXNhZSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkxlcHRvdGhlY2F0YWUiXSA8LSAiTGVwdG90aGVjYXRhIChMZXB0b21lZHVzYWUpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiTGl0aG9kaWRhZSJdIDwtICJMaXRob2RpZGFlIChBbm9tdXJhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIk1hamlkYWUiXSA8LSAiTWFqaWRhZSAoQnJhY2h5dXJhKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIk1ldGVyeXRocm9wcyByb2J1c3RhIl0gPC0gIk1ldGVyeXRocm9wcyByb2J1c3R1cyAoTS4gcm9idXN0YSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJNeXNpZGEiXSA8LSAiTXlzaWRhIChVbmlkZW50aWZpYWJsZSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJPY3RvcG9kYSJdIDwtICJPY3RvcG9kaWZvcm1lcyAoT2N0b3B1cykgbGFydmFlIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiT2l0aG9uYSBzZXRpZ2VyYSJdIDwtICJPaXRob25hIHNldGlnZXJhIChPLiBzcGluaXJvc3RyaXMpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiT2l0aG9uYSBzcGluaXJvc3RyaXMiXSA8LSAiT2l0aG9uYSBzZXRpZ2VyYSAoTy4gc3Bpbmlyb3N0cmlzKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIkNoaW9ub2VjZXRlcyBzcHAuIl0gPC0gIk9yZWdvbmlpZGFlIChCcmFjaHl1cmEpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiSHlhcyBzcHAuIl0gPC0gIk9yZWdvbmlpZGFlIChCcmFjaHl1cmEpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiT3JlZ29uaWlkYWUiXSA8LSAiT3JlZ29uaWlkYWUgKEJyYWNoeXVyYSkiCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJQYWNpZmFjYW50aG9teXNpcyBuZXBocm9waHRoYWxtYSJdIDwtICJQYWNpZmFjYW50aG9teXNpcyAoQWNhbnRob215c2lzKSBuZXBocm9waHRoYWxtYSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlBhZ3VyaWRhZSJdIDwtICJQYWd1cmlkYWUgKEFub211cmEpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiUGFyYWV1Y2hhZXRhIGVsb25nYXRhIl0gPC0gIlBhcmFldWNoYWV0YSBlbG9uZ2F0YSAoRXVjaGFldGEgZWxvbmdhdGEpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiUGFyYXNhZ2l0dGEgZWxlZ2FucyJdIDwtICJQYXJhc2FnaXR0YSAoU2FnaXR0YSkgZWxlZ2FucyIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlBob3JvbmlkYSAoYWN0aW5vdHJvY2ggbGFydmEpIl0gPC0gIlBob3JvbmlkYSBhY3Rpbm90cm9jaCAobGFydmFlKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlBvZG9uIGxldWNrYXJ0aWkiXSA8LSAiUG9kb24gbGV1Y2thcnRpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiUHNldWRvYW1hbGxvdGhyaXggb3ZhdGEiXSA8LSAiUHNldWRvYW1hbGxvdGhyaXggKHNjb2xlY2l0aHJpY2VsbGEpIG92YXRhIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiU3lycmhvZSJdIDwtICJTeXJyaG9lIHNwcC4iCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJUZXNzYXJhYnJhY2hpb24gb2N1bGF0dXMiXSA8LSAiVGVzc2FyYWJyYWNoaW9uIG9jdWxhdHVtIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiVGhlY29zb21hdGEiXSA8LSAiVGhlY29zb21hdGEgKFVuaWRlbnRpZmlhYmxlKSIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlRoZW1pc3RvIHBhY2lmaWNhIl0gPC0gIlRoZW1pc3RvIHBhY2lmaWNhIChQYXJhdGhlbWlzdG8gcGFjaWZpY2EpIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiVHJpY29uaWEgc3AuIl0gPC0gIlRyaWNvbmlhIHNwcC4iCgpFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUVbRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FID09ICJDYWxhbmlkYWUiXSA8LSAiVW5pZGVudGlmaWVkIENhbGFuaWRzIgoKRU1BX0NvbWJpbmVkX1JlY29kZSRUQVhPTl9OQU1FW0VNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRSA9PSAiQ2FsYW5vaWRhIl0gPC0gIlVuaWRlbnRpZmllZCBDYWxhbmlkcyIKCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fTkFNRVtFTUFfQ29tYmluZWRfUmVjb2RlJFRBWE9OX05BTUUgPT0gIlhlbmFjYW50aG9teXNpcyBwc2V1ZG9tYWNyb3BzaXMiXSA8LSAiWGVub2FjYW50aG9teXNpcyAoQWNhbnRob215c2lzKSBwc2V1ZG9tYWNyb3BzaXMiCgoKCiNDcmVhdGUgVk9MVU1FX0ZJTFRFUkVEIGNvbHVtbiBieSByZW5hbWluZyBUb3dWT2x1bWUgY29sdW1uCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBWT0xVTUVfRklMVEVSRUQgPSBUb3dWb2x1bWUpCgojUmVuYW1lIEJvdHRvbURlcHRoIHRvIEJPVFRPTV9ERVBUSCB0byBtYXRjaCBFY29EQUFUCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIHJlbmFtZShFTUFfQ29tYmluZWRfUmVjb2RlLCBCT1RUT01fREVQVEggPSBCb3R0b21EZXB0aCkKCgojUmVhcnJhbmdlIHRoZSBmaWxlIHRvIGFkZCBhIGNvbHVtbiBpbmRpY2F0aW5nIG9yaWdpbiBvZiBkYXRhLCB0byBoYXZlIHRoZW0gaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEVjb0RBQVQgZmlsZSBhbmQgcmVtb3ZlIG5vbi1tYXRjaGVkIGNvbHVtbnMgcHJpb3IgdG8gbWVyZ2UKCgpFTUFfQ29tYmluZWRfUmVjb2RlJERBVEFfU09VUkNFIDwtICJFTUEiCgojSW5zZXQgY29sdW1ucyBub3QgcHJlc2VudCBpbiBFTUEsIGJ1dCB3aWxsIGJlIGluIEVjb0RBQVQKCkVNQV9Db21iaW5lZF9SZWNvZGUkRElTX1BFUlZPTE0yIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkRElTX1BFUlZPTE0zIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkRk9DSV9JRCA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJEZPQ0lfU0FNUExFX0lEIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkR0VPR1JBUEhJQ19BUkVBIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkSEFVTF9JRCA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJEhBVUxfTkFNRSA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJE1JTl9HRUFSX0RFUFRIIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkTkVUIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkU0FNUExFX0RFUFRIIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkU0VYIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkU1BFQ0lNRU5fRk9STSA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJFNUQUdFIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkVEFYT05fU0laRSA8LSBOQQpFTUFfQ29tYmluZWRfUmVjb2RlJFpPT1BfQ09QRVBPRF9OQVVQTElJIDwtIE5BCkVNQV9Db21iaW5lZF9SZWNvZGUkWk9PUF9FVVBIQVVTSUlEX0VHRyA8LSBOQQoKCiNDcmVhdGUgSEFVTF9JRCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIG1lcmdpbmcgcHVycG9zZXMKCkVNQV9Db21iaW5lZF9SZWNvZGUkSEFVTF9JRCA8LSBwYXN0ZTAoRU1BX0NvbWJpbmVkX1JlY29kZSRDUlVJU0UsIiAiLEVNQV9Db21iaW5lZF9SZWNvZGUkU1RBVElPTl9OQU1FLCIgIiwgMSwiICIsIEVNQV9Db21iaW5lZF9SZWNvZGUkR0VBUl9OQU1FLCIgIiwgMSkKCgojQ3JlYXRlIHZlY3RvciBvZiBjb2x1bW4gbmFtZXMgZnJvbSB0aGUgRWNvREFBVCBGaWxlCgpFY29EQUFUX0NvbHVtbk5hbWVzIDwtIGMoIkJPVFRPTV9ERVBUSCIsICJDUlVJU0UiLCAiREFZIiwgIkRJU19QRVJWT0xNMiIsICJESVNfUEVSVk9MTTMiLCAiRVNUX05VTV9QRVJNMiIsICJFU1RfTlVNX1BFUk0zIiwgIkZPQ0lfSUQiLCAiRk9DSV9TQU1QTEVfSUQiLCAiR0VBUl9OQU1FIiwgIkdFT0dSQVBISUNfQVJFQSIsICJHTVRfREFURV9USU1FX1RYVCIsICJIQVVMX0lEIiwgIkhBVUxfTkFNRSIsICJIQVVMX1BFUkZPUk1BTkNFIiwgIkxBVCIsICJMT04iLCAiTUFYX0dFQVJfREVQVEgiLCAiTUVTSCIsICJNSU5fR0VBUl9ERVBUSCIsICJNT05USCIsICJORVQiLCAiU0FNUExFX0RFUFRIIiwgIlNFWCIsICJTRVhfTkFNRSIsICJTSVpFX05BTUUiLCAiU1BFQ0lNRU5fRk9STSIsICJTVEFHRSIsICJTVEFHRV9OQU1FIiwgIlNUQVRJT05fTkFNRSIsICJUQVhPTl9OQU1FIiwgIlRBWE9OX1NJWkUiLCAiVk9MVU1FX0ZJTFRFUkVEIiwgICJZRUFSIiwgIlpPT1BfQ09QRVBPRF9OQVVQTElJIiwgIlpPT1BfRVVQSEFVU0lJRF9FR0ciLCAiREFUQV9TT1VSQ0UiKQoKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBFTUFfQ29tYmluZWRfUmVjb2RlWywgRWNvREFBVF9Db2x1bW5OYW1lc10KCmBgYAoKSW1wb3J0IEVjb0RBQVQgZGF0YQoKQ29ubmVjdCB0byBkYXRhYmFzZSB0byBpbXBvcnQgem9vcCBkYXRhIGRpcmVjdGx5IGZyb20gRWNvREFBVAoKYGBge3J9CiNDcmVhdGUgY29ubmVjdCB0byB0aGUgQUZTQyBkYXRhYmFzZQojIAojIHVzZXIgPC0gcmVhZGxpbmUoIklucHV0IFVzZXJuYW1lOiAiKQojIHBzd2QgPC0gcmVhZGxpbmUoIklucHV0IFBhc3N3b3JkOiAiKQojIAojIEFGU0NfQ29ubmVjdCA8LSBvZGJjQ29ubmVjdCgiQUZTQyIsIHVpZD11c2VyLCAgcHdkPXBzd2QpCiMgCiMgCiMgI0RlbGV0ZSBhbmQgcmVmcmVzaCB0YWJsZSB0byBkcmF3IGZyb20sIGluIHRoaXMgY2FzZSBpdCBpcyBTUEVDSU1FTl9NQUlOX0dFT00KIyAKIyBzcWxRdWVyeShBRlNDX0Nvbm5lY3QsIkRST1AgVEFCTEUgU1BFQ0lNRU5fTUFJTl9HRU9NOyIpCiMgCiMgc3FsUXVlcnkoQUZTQ19Db25uZWN0LCJDUkVBVEUgVEFCTEUgU1BFQ0lNRU5fTUFJTl9HRU9NIEFTIFNFTEVDVCAqIEZST00gRUNPREFBVC5TUEVDSU1FTl9NQUlOX0dFT007IikKCgojUnVuIFNRTCBRdWVyaWVzIHRvIGJ1aWxkIHpvb3BsYW5rdG9uIGRhdGFzZXQgCiMgCiMgI1F1ZXJ5IHRoZSBkYXRhYmFzZQojIAojIHpvb3BkYXRhIDwtIHNxbFF1ZXJ5KEFGU0NfQ29ubmVjdCwgIlNFTEVDVCBCT1RUT01fREVQVEgsCiMgQ1JVSVNFLCBEQVksIERJU19QRVJWT0xNMiwgRElTX1BFUlZPTE0zLCBFU1RfTlVNX1BFUk0yLCBFU1RfTlVNX1BFUk0zLCBGT0NJX0lELCBGT0NJX1NBTVBMRV9JRCwgR0VBUl9OQU1FLCAKIyBHRU9HUkFQSElDX0FSRUEsIEdNVF9EQVRFX1RJTUVfVFhULCBIQVVMX0lELCBIQVVMX05BTUUsIEhBVUxfUEVSRk9STUFOQ0UsIExBVCwgTE9OLCBNQVhfR0VBUl9ERVBUSCwgTUVTSCwKIyBNSU5fR0VBUl9ERVBUSCwgTU9OVEgsIE5FVCwgU0FNUExFX0RFUFRILCBTRVgsIFNFWF9OQU1FLCBTSVpFX05BTUUsIFNQRUNJTUVOX0ZPUk0sIFNUQUdFLCBTVEFHRV9OQU1FLCBTVEFUSU9OX05BTUUsCiMgVEFYT05fTkFNRSwgVEFYT05fU0laRSwgVk9MVU1FX0ZJTFRFUkVELCBZRUFSLCBaT09QX0NPUEVQT0RfTkFVUExJSSwgWk9PUF9FVVBIQVVTSUlEX0VHRwojIEZST00gU1BFQ0lNRU5fTUFJTl9HRU9NIFdIRVJFIE9SSUdfREIgTElLRSAnQk9CJzsiLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKQoKI0Nsb3NlIGRhdGFiYXNlIGNvbm5lY3Rpb24KIAojIG9kYmNDbG9zZShBRlNDX0Nvbm5lY3QpCgojRHJvcCBvbmUgY3J1aXNlIHVzaW5nIHRoZSBvbGQgcHJvdG9jb2wgT1MxNyBhbmQgcmVwbGFjZSB3aXRoIGNvcnJlY3QgZGF0YQp6b29wZGF0YSA8LSByZWFkX2NzdihoZXJlKCJkYXRhIiwiQWxsWm9vcFJhdy5jc3YiKSkgJT4lCiAgZmlsdGVyKCFDUlVJU0U9PSJPUzE3LTAxIikgJT4lCiAgZHBseXI6OnNlbGVjdCgtLi4uMSkKCiNCcmluZyBpbiBPUzE3LTAxCk9TMTcwMSA8LSByZWFkLmNzdihoZXJlKCJkYXRhIiwgIlJhdy1EYXRhIiwgIk9TMTcwMV9FY29GT0NJX1pvb3BsYW5rdG9uTmV0LmNzdiIpKQoKem9vcGRhdGEgPC0gcmJpbmQoem9vcGRhdGEsIE9TMTcwMSkKCiNEZWxldGUgT1MxNzAxCgpybShPUzE3MDEpCgoKYGBgCgpEbyBzb21lIGRhdGEgdGlkeWluZyBmb3IgdGhlIEVjb0RBQVQgZGF0YSBzZXQgYW5kIGNvbWJpbmUgdGhlIEVjb0RBQVQgYW5kIEVNQSBkYXRhc2V0cwoKCmBgYHtyfQoKI1JlY29kZSBtZXNoIHNpemVzIGZvciAxNTAsIDMzMywgNTAwCgp6b29wZGF0YSRNRVNIW3pvb3BkYXRhJE1FU0g9PTE1MF0gPC0gMTUzCnpvb3BkYXRhJE1FU0hbem9vcGRhdGEkTUVTSD09MTU0XSA8LSAxNTMKem9vcGRhdGEkTUVTSFt6b29wZGF0YSRNRVNIPT0xMTUzXSA8LSAxNTMKem9vcGRhdGEkTUVTSFt6b29wZGF0YSRNRVNIPT0zMzVdIDwtIDMzMwp6b29wZGF0YSRNRVNIW3pvb3BkYXRhJE1FU0g9PTUwMF0gPC0gNTA1CgoKI0NvdW50IG51bWJlciBvZiBjcnVpc2VzIGluIHRoZSBFTUEgZGF0YXNldAoKRU1BX0NvbWJpbmVkX1JlY29kZV9ieUNSVUlTRSA8LSBncm91cF9ieShFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UpCkVNQV9Db21iaW5lZF9SZWNvZGVfQ3J1aXNlQ291bnQgPC0gc3VtbWFyaXNlKEVNQV9Db21iaW5lZF9SZWNvZGVfYnlDUlVJU0UsIG5fZGlzdGluY3QoWUVBUikpCgp1bmdyb3VwKEVNQV9Db21iaW5lZF9SZWNvZGUpCgojQ291bnQgbnVtYmVyIG9mIGNydWlzZXMgaW4gdGhlIEVNQSBkYXRhc2V0Cgp6b29wZGF0YV9ieUNSVUlTRSA8LSBncm91cF9ieSh6b29wZGF0YSwgQ1JVSVNFKQp6b29wZGF0YV9DcnVpc2VDb3VudCA8LSBzdW1tYXJpc2Uoem9vcGRhdGFfYnlDUlVJU0UsIG5fZGlzdGluY3QoWUVBUikpCgp1bmdyb3VwKHpvb3BkYXRhKQogCgojRG8gYSBqb2luIHRvIHNlZSBpZiBjcnVpc2VzIGhhdmUgbWF0Y2hlcyBpbiBib3RoIGRhdGFzZXRzOgoKVGVzdERhdGEgPC0gc2VtaV9qb2luKEVNQV9Db21iaW5lZF9SZWNvZGVfQ3J1aXNlQ291bnQsIHpvb3BkYXRhX0NydWlzZUNvdW50LCBieSA9ICJDUlVJU0UiKQoKCgoKIzEwIGNydWlzZXMgYXJlIHByZXNlbnQgaW4gRU1BIGRhdGFzZXQgYW5kIHpvb3BkYXRhIGRhdGEgc2V0LCByZW1vdmUgdGhvc2UgZnJvbSB0aGUgRU1BIGRhdGFzZXQgdG8gYXZvaWQgZG91YmxlIGNvdW50aW5nCgpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIGZpbHRlcihFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UhPSIxR1A5OSIpCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IjNEWTEyIikKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBmaWx0ZXIoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFIT0iQUUxNC0wMSIpCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IkFFMTUtMDEiKQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIGZpbHRlcihFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UhPSJEWTE0LTA2IikKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBmaWx0ZXIoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFIT0iRFkxNC0wOCIpCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9IkRZMTUtMDciKQpFTUFfQ29tYmluZWRfUmVjb2RlIDwtIGZpbHRlcihFTUFfQ29tYmluZWRfUmVjb2RlLCBDUlVJU0UhPSJEWTE1LTA4IikKRU1BX0NvbWJpbmVkX1JlY29kZSA8LSBmaWx0ZXIoRU1BX0NvbWJpbmVkX1JlY29kZSwgQ1JVSVNFIT0iRFkxNi0wOSIpCkVNQV9Db21iaW5lZF9SZWNvZGUgPC0gZmlsdGVyKEVNQV9Db21iaW5lZF9SZWNvZGUsIENSVUlTRSE9Ik5XMTctMDUiKQoKI1JlbW92ZUZpbGVzCgpybShFTUFfQ29tYmluZWRfUmVjb2RlX2J5Q1JVSVNFLCBFTUFfQ29tYmluZWRfUmVjb2RlX0NydWlzZUNvdW50LCB6b29wZGF0YV9ieUNSVUlTRSwgem9vcGRhdGFfQ3J1aXNlQ291bnQsIFRlc3REYXRhKQoKI0NvbWJpbmUgdGhlIEVNQSBhbmQgRWNvREFBVCBkYXRhc2V0cwoKI0FkZCBEYXRhIFNvdXJjZSBmaWxlIHRvIHRoZSB6b29wZGF0YSBwcmlvciB0byBjb21iaW5hdGlvbgoKem9vcGRhdGEkREFUQV9TT1VSQ0UgPC0gIkVjb0RBQVQiCgoKI0NvbWJpbmUgZGF0YXNldHMgCgpBbGxab29wX1JhdyA8LSByYmluZChFTUFfQ29tYmluZWRfUmVjb2RlLCB6b29wZGF0YSkKCgoKI0NyZWF0ZSB2ZWN0b3Igb2YgQ29tYmluZWQgY29sdW1uIG5hbWVzIHRvIHRyaW0gZGF0YXNldCBmb3IgZmluYWwgcHJvY2Vzc2luZwoKQ29tYmluZWRfQ29sdW1uTmFtZXMgPC0gYygiQk9UVE9NX0RFUFRIIiwgIkNSVUlTRSIsICJEQVkiLCAiRElTX1BFUlZPTE0yIiwgIkRJU19QRVJWT0xNMyIsICJFU1RfTlVNX1BFUk0yIiwgIkVTVF9OVU1fUEVSTTMiLCAiR0VBUl9OQU1FIiwgIkdNVF9EQVRFX1RJTUVfVFhUIiwgIkhBVUxfSUQiLCAiSEFVTF9QRVJGT1JNQU5DRSIsICJMQVQiLCAiTE9OIiwgIk1BWF9HRUFSX0RFUFRIIiwgIk1FU0giLCAiTU9OVEgiLCAiU1BFQ0lNRU5fRk9STSIsICJTRVhfTkFNRSIsICJTSVpFX05BTUUiLCAiU1RBR0VfTkFNRSIsICJTVEFUSU9OX05BTUUiLCAiVEFYT05fTkFNRSIsICJWT0xVTUVfRklMVEVSRUQiLCAgIllFQVIiLCAiREFUQV9TT1VSQ0UiKQoKI0tlZXAgb25seSB0aG9zZSBjb2x1bW5zCgpBbGxab29wX1JhdyA8LSBBbGxab29wX1Jhd1ssQ29tYmluZWRfQ29sdW1uTmFtZXNdCgojUmVtb3ZlIGZpbGVzCgpybSAoRU1BX0NvbWJpbmVkLCBFTUFfQ29tYmluZWRfUmVjb2RlLCB6b29wZGF0YSkKCgoKYGBgCgoKUXVpY2sgbWFwIG9mIHRoZSByYXcgZGF0YSBzdGF0aW9ucwoKYGBge3IsIGV2YWwgPSBGQUxTRX0KCiNRdWljayBwbG90IHRvIHRha2UgYSBsb29rIGF0IHRoZSBkYXRhc2V0IHNvIGZhcgoKI0dldCB3b3JsZCBkYXRhIGZyb20gI25hdHVyYWwgZWFydGggcGFja2FnZQoKd29ybGQgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gIm1lZGl1bSIsIHJldHVybmNsYXNzID0gInNmIikKY2xhc3Mod29ybGQpCgojIGdldCByZWdpb25hbCBwb2x5Z29ucwpyZWcgPSBtYXBfZGF0YSgid29ybGQySGlyZXMiKQpyZWcgPSBzdWJzZXQocmVnLCByZWdpb24gJWluJSBjKCdVU1NSJywgJ1VTQScpKQoKIyBjb252ZXJ0IGxhdCBsb25ncwpyZWckbG9uZyA9ICgzNjAgLSByZWckbG9uZykqLTEKCiMgc2V0IG1hcCBsaW1pdHMKbG9ucyA9IGMoLTE3OS41LCAtMTMwKQpsYXRzID0gYyg1MCwgNzQpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAKIyAjIG1ha2UgcGxvdAojIFJlZ2lvbl9NYXBfUmF3RGF0YSA8LSBnZ3Bsb3QoKSsKIyAKIyAgICMgYWRkIGNvYXN0bGluZQojICAgZ2VvbV9zZihkYXRhID0gd29ybGQpKwojICAgICBjb29yZF9zZih4bGltID0gbG9ucywgeWxpbSA9IGxhdHMsIGV4cGFuZCA9IEZBTFNFKSsKIyAKIyAgICNQbG90IHN0YXRpb24gcG9pbnRzCiMgICBnZW9tX3BvaW50KGRhdGE9QWxsWm9vcF9SYXcsIG1hcHBpbmc9YWVzKExPTiwgTEFUKSkrCiMgCiMgICAjIGZvcm1hdHRpbmcKIyAgIHRoZW1lX2J3KCkrCiMgICB4bGFiKCJMb25naXR1ZGUiKSsKIyAgIHlsYWIoIkxhdGl0dWRlIikKIyAKIyBSZWdpb25fTWFwX1Jhd0RhdGEKCgpgYGAKCkRhdGEgRmlsdGVyaW5nIGZvciBCUCBTeW50aGVzaXMgUHJvamVjdAoKYGBge3J9CgojRmlyc3QgZmlsdGVyIGZvciBhbGwgZGF0YSBub3J0aCBvZiA2ME4KICAgICAgIAojCk5CU19ab29wIDwtIGZpbHRlcihBbGxab29wX1JhdywgTEFUPj01NSkKCgojTm93IG1hcCBhZ2FpbiB0byB0YWtlIGEgbG9vawojIAojICMgbWFrZSBwbG90CiMgUmVnaW9uX01hcF9OQlNfUHJvY2Vzc18xIDwtIGdncGxvdCgpKwojIAojICAgIyBhZGQgY29hc3RsaW5lCiMgICBnZW9tX3NmKGRhdGEgPSB3b3JsZCkrCiMgICAgIGNvb3JkX3NmKHhsaW0gPSBsb25zLCB5bGltID0gbGF0cywgZXhwYW5kID0gRkFMU0UpKwojIAojICAgI1Bsb3Qgc3RhdGlvbiBwb2ludHMKIyAgIGdlb21fcG9pbnQoZGF0YT1OQlNfWm9vcCwgbWFwcGluZz1hZXMoTE9OLCBMQVQpKSsKIyAKIyAgICMgZm9ybWF0dGluZwojICAgdGhlbWVfYncoKSsKIyAgIHhsYWIoIkxvbmdpdHVkZSIpKwojICAgeWxhYigiTGF0aXR1ZGUiKQojIAojIFJlZ2lvbl9NYXBfTkJTX1Byb2Nlc3NfMQojIAojIAojICNMb29rcyBsaWtlIHNvbWUgZGF0YSBmcm9tIHRoZSBHT0EgaXMgc3RpbGwgcHJlc2VudCwgc28gcmVtb3ZlIGRhdGEgPiAxNTUKCiMKTkJTX1pvb3AgPC0gZmlsdGVyKE5CU19ab29wLCBMT048PSAtMTUwKQoKI05vdyBtYXAgYWdhaW4gdG8gdGFrZSBhIGxvb2sKIyAKIyAjIG1ha2UgcGxvdAojIFJlZ2lvbl9NYXBfTkJTX1Byb2Nlc3NfMiA8LSBnZ3Bsb3QoKSsKIyAKIyAgICMgYWRkIGNvYXN0bGluZQojICAgZ2VvbV9zZihkYXRhID0gd29ybGQpKwojICAgICBjb29yZF9zZih4bGltID0gbG9ucywgeWxpbSA9IGxhdHMsIGV4cGFuZCA9IEZBTFNFKSsKIyAKIyAgICNQbG90IHN0YXRpb24gcG9pbnRzCiMgICBnZW9tX3BvaW50KGRhdGE9TkJTX1pvb3AsIG1hcHBpbmc9YWVzKExPTiwgTEFUKSkrCiMgCiMgICAjIGZvcm1hdHRpbmcKIyAgIHRoZW1lX2J3KCkrCiMgICB4bGFiKCJMb25naXR1ZGUiKSsKIyAgIHlsYWIoIkxhdGl0dWRlIikKIyAKIyBSZWdpb25fTWFwX05CU19Qcm9jZXNzXzIKIyAKIyAjU3BhdGlhbCBjb3ZlcmFnZSBsb29rcyBjb3JyZWN0CgojTm93IGNoZWNrIHRlbXBvcmFsIGNvdmVyYWdlCgpzb3J0KHVuaXF1ZShOQlNfWm9vcCRZRUFSKSwgZGVjcmVhc2luZyA9IEZBTFNFKQoKI1JlbW92ZSBkYXRhIGZyb20gMTk5NiBhcyBpdCBpcyByZW1vdmVkIGZyb20gYWxsIG90aGVyIHllYXJzIG9mIGNvbGxlY3Rpb24KCk5CU19ab29wIDwtIGZpbHRlcihOQlNfWm9vcCwgWUVBUiE9MTk5NikKCiNUYWtlIGEgbG9vayBhdCB0aGUgZ2VhcnMgcHJlc2VudCBpbiB0aGUgZGF0YXNldAoKdW5pcXVlKE5CU19ab29wJEdFQVJfTkFNRSkKdW5pcXVlKE5CU19ab29wJE1FU0gpCgojUm91Z2ggZXN0aW1hdGUgb2YgbnVtYmVyIG9mIHNhbXBsZXMgYnkgZ2VhciB0eXBlCgpOQlNfWm9vcF9HZWFyIDwtIE5CU19ab29wWywgYygiQ1JVSVNFIiwgIkdFQVJfTkFNRSIsICJNRVNIIiwgIkxBVCIsICJMT04iKV0KCk5CU19ab29wX0dlYXIgPC0gZGlzdGluY3QoTkJTX1pvb3BfR2VhcikKCk5CU19ab29wX0dlYXJfYnlHZWFyIDwtIGdyb3VwX2J5KE5CU19ab29wX0dlYXIsIEdFQVJfTkFNRSwgTUVTSCkKCk5CU19HZWFyX1N1bW1hcnkgPC0gc3VtbWFyaXNlKE5CU19ab29wX0dlYXJfYnlHZWFyLCBuKCkpCgp1bmdyb3VwKE5CU19ab29wX0dlYXIpCgojVGhpcyBzaG93cyBhIGZldyBnZWFycyBjYW4gYmUgZWxpbWluYXRlZCBmb3IgbG93IHNhbXBsZSBzaXplIChWNjBCT04sIDgwQk9OKSBhbmQgQ0FMVkVUIGhhcyB0b28gc21hbGwgbWVzaCBzaXplCgpOQlNfWm9vcCA8LSBmaWx0ZXIoTkJTX1pvb3AsIEdFQVJfTkFNRSE9IkNBTFZFVCIpCk5CU19ab29wIDwtIGZpbHRlcihOQlNfWm9vcCwgR0VBUl9OQU1FIT0iVjYwQk9OIikKTkJTX1pvb3AgPC0gZmlsdGVyKE5CU19ab29wLCBHRUFSX05BTUUhPSI4MEJPTiIpCgojUmVtb3ZlIHNsZWQgZGF0YSBhcyB0aGlzIGlzIGJpYXNlZCB0b3dhcmQgYSBib3R0b20gc2FtcGxlCgpOQlNfWm9vcCA8LSBmaWx0ZXIoTkJTX1pvb3AsIEdFQVJfTkFNRSE9IlNMRUQiKQoKCgojUmVtb3ZlIGZhaWxlZCBhbmQgcXVlc3Rpb25hYmxlIGhhdWxzCgojRmlyc3Qgc2F2ZSB0aGUgTkEgc2luY2UgRU1BIGRhdGEgZG9lcyBub3QgYWx3YXlzIHJlY29yZCBIQVVMX1BFUkZPUk1BTkNFCgpIYXVsUGVyZl9OQSA8LSBOQlNfWm9vcFtpcy5uYShOQlNfWm9vcCRIQVVMX1BFUkZPUk1BTkNFKSxdCgpOQlNfWm9vcF9HT09EIDwtIGZpbHRlcihOQlNfWm9vcCwgSEFVTF9QRVJGT1JNQU5DRT09IkdPT0QiKQoKI1JlYnVpbGQgZGF0YXNldCB3aXRob3V0IFFVRVNUIGFuZCBGQUlMIEhBVUxTCgpOQlNfWm9vcCA8LSByYmluZChIYXVsUGVyZl9OQSwgTkJTX1pvb3BfR09PRCkKCgoKI1dyaXRlIHRoaXMgcmF3IGZpbGUgcHJpb3IgdG8gZnVydGhlciBwcm9jZXNzaW5nCgp3cml0ZS5jc3YoTkJTX1pvb3AsIGhlcmUoImRhdGEiLCAiUmF3LURhdGEiLCAiTkJTX1pvb3BfUmF3LmNzdiIpKQoKYGBgCgpCcmluZyBpbiB0aGUgQ29hcnNlIFRheGEgTGlzdCB0byBhaWQgaW4gbHVtcGluZyBhbmQgZmlsdGVyIG91dCBzb21lIHRheGEKCgpgYGB7cn0KClRheGFMaXN0X0NvYXJzZSA8LSByZWFkLmNzdihoZXJlKCJkYXRhIiwgIlRheGEtTGlzdHMiLCAiVGF4YUxpc3RfQ29hcnNlLmNzdiIpKQoKI05vdyBhZGQgdGhpcyB0byB0aGUgZmlsZQoKVGF4YUxpc3RfQ29hcnNlIDwtIGRpc3RpbmN0KFRheGFMaXN0X0NvYXJzZSkKCk5CU19ab29wX1Byb2Nlc3MgPC0gbGVmdF9qb2luKE5CU19ab29wLCBUYXhhTGlzdF9Db2Fyc2UsIGJ5ID0gIlRBWE9OX05BTUUiKQoKI0ZpbHRlciBvdXQgdGhvc2UgZGF0YSBtYXJrZWQgZm9yIHJlbW92YWwKCk5CU19ab29wX1Byb2Nlc3MgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIE5PVEUgIT0gIlJlbW92ZSIpCgoKYGBgCgoKCkNyZWF0ZSB0YXhhIHNwZWNpZmljIGRhdGEgc2V0cyB0byBzZWxlY3QgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZyb20gdGhlIGNvcnJlY3QgR0VBUl9OQU1FIGFuZCBNRVNIIGZvciBlYWNoIHNwZWNpZmljIGNvYXJzZSB0YXhhCgpBY2FydGlhIHNwcAoKYGBge3J9CgpBY2FydGlhX3NwcCA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJBY2FydGlhIHNwcC4iKQoKI0FjYXJ0aWEgaXMgYSBzbWFsbCBjb3BlcG9kLCBzbyBhbGwgZXN0aW1hdGVzIHNob3VsZCBjb21lIGZyb20gdGhlIHNtYWxsZXIgbmV0cwoKI0ZpbHRlciBmb3IgY29ycmVjdCBnZWFyCgpBY2FydGlhX3NwcCA8LSBmaWx0ZXIoQWNhcnRpYV9zcHAsIEdFQVJfTkFNRSE9ICI2MEJPTiIpCgoKI0JlaW5nIHRvIGJ1aWxkIGZpbmFsIGRhdGEgc2V0CgoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSBBY2FydGlhX3NwcAoKCgpgYGAKCkFnbGFudGhhIGRpZ2l0YWxlCgpgYGB7cn0KCkFnbGFudGhhX2RpZ2l0YWxlIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkFnbGFudGhhIGRpZ2l0YWxlIikKCiNDaG9vc2UgdG8gZXN0aW1hdGUgQ25pZGFyaWFucyBmcm9tIHRoZSA2MEJPTiBvbmx5CgpBZ2xhbnRoYV9kaWdpdGFsZSA8LSBmaWx0ZXIoQWdsYW50aGFfZGlnaXRhbGUsIEdFQVJfTkFNRT09IjYwQk9OIikKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEFnbGFudGhhX2RpZ2l0YWxlKQoKCmBgYAoKQW1waGlwb2RzCgpgYGB7cn0KCkFtcGhpcG9kYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJBbXBoaXBvZGEiKQoKI0FtaGlwb2RzIHdpbGwgYmUgZXN0aW1hdGVkIGZyb20gdGhlIDYwQk9OIG9ubHkKCkFtcGhpcG9kYSA8LSBmaWx0ZXIoQW1waGlwb2RhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBBbXBoaXBvZGEpCgoKYGBgCgoKQW5vbXVyYQoKYGBge3J9CgpBbm9tdXJhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkFub211cmEiKQoKI0Fub211cmEgZXN0aW1hdGUgZnJvbSA2MEJPTiBvbmx5CgpBbm9tdXJhIDwtIGZpbHRlcihBbXBoaXBvZGEsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQW5vbXVyYSkKCgpgYGAKCgpBcHBlbmRpY3VsYXJpYQoKYGBge3J9CgpBcHBlbmRpY3VsYXJpYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJBcHBlbmRpY3VsYXJpYSIpCgojQ2FuIGZpbHRlciBmb3IgYm90aCBnZWFycyBhbmQgdGhlbiBhZGQgYSB0YXhhIGNvYXJzZSBvZiBBcHBlbmRpY3VsYXJpYV9sYXJnZSBhbmQgQXBwZW5kaWN1bGFyX3NtYWxsCgpBcHBlbmRpY3VsYXJpYV9sYXJnZSA8LSBmaWx0ZXIoQXBwZW5kaWN1bGFyaWEsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNSZWNvZGUgY29hcnNlIHRheGEKCkFwcGVuZGljdWxhcmlhX2xhcmdlJFRBWEFfQ09BUlNFW0FwcGVuZGljdWxhcmlhX2xhcmdlJFRBWEFfQ09BUlNFPT0iQXBwZW5kaWN1bGFyaWEiXSA8LSAiQXBwZW5kaWN1bGFyaWFfbGFyZ2UiCgoKQXBwZW5kaWN1bGFyaWFfc21hbGwgPC0gZmlsdGVyKEFwcGVuZGljdWxhcmlhLCBHRUFSX05BTUUhPSI2MEJPTiIpCgojUmVjb2RlIGNvYXJzZSB0YXhhCgpBcHBlbmRpY3VsYXJpYV9zbWFsbCRUQVhBX0NPQVJTRVtBcHBlbmRpY3VsYXJpYV9zbWFsbCRUQVhBX0NPQVJTRT09IkFwcGVuZGljdWxhcmlhIl0gPC0gIkFwcGVuZGljdWxhcmlhX3NtYWxsIgoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQXBwZW5kaWN1bGFyaWFfbGFyZ2UsIEFwcGVuZGljdWxhcmlhX3NtYWxsKQoKCmBgYAoKQml2YWx2aWEKCgpgYGB7cn0KCkJpdmFsdmlhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkJpdmFsdmlhIikKCiNCaXZhbHZpYSBlc3RpbWF0ZSBmcm9tIHNtYWxsZXIgbmV0cyBvbmx5CgpCaXZhbHZpYSA8LSBmaWx0ZXIoQml2YWx2aWEsIEdFQVJfTkFNRSE9IjYwQk9OIikKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJpdmFsdmlhKQoKCgoKYGBgCgoKQnJhY2h5dXJhCgpgYGB7cn0KCkJyYWNoeXVyYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJCcmFjaHl1cmEiKQoKI0JyYWNoeXVyYSBlc3RpbWF0ZSBmcm9tIDYwQk9OIG9ubHkKCkJyYWNoeXVyYSA8LSBmaWx0ZXIoQnJhY2h5dXJhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJyYWNoeXVyYSkKCgoKYGBgCgpDYWxhbnVzIGh5cGVyYm9yZXVzCgoKYGBge3J9CgpDYWxhbnVzX2h5cGVyYm9yZXVzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNhbGFudXMgaHlwZXJib3JldXMiKQoKCiNTZXBhcmF0ZSBFTUEgZGF0YSBhcyB0aGV5IHdlcmUgc29ydGVkIHVuZGVyIGRpZmZlcmVudCBwcm90b2NvbHMKCkNhbGFudXNfaHlwZXJib3JldXNfRU1BIDwtIGZpbHRlcihDYWxhbnVzX2h5cGVyYm9yZXVzLCBEQVRBX1NPVVJDRT09IkVNQSIpCkNhbGFudXNfaHlwZXJib3JldXNfRWNvREFBVCA8LSBmaWx0ZXIoQ2FsYW51c19oeXBlcmJvcmV1cywgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikKCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhCgpDYWxhbnVzX2h5cGVyYm9yZXVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KENhbGFudXNfaHlwZXJib3JldXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQoKQ2FsYW51c19oeXBlcmJvcmV1c19FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShDYWxhbnVzX2h5cGVyYm9yZXVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLG4oKSkKCiNUaGVzZSBsb29rIGNvcnJlY3QKCiNOb3cgZmlsdGVyIHRoZSBFTUEgZGF0YSB0byBtYXRjaCB0aGUgRWNvREFBVCBkYXRhLiBFTUEgdGVuZHMgdG8gZG91YmxlIGNvdW50IHZhcmlhYmxlcyBmcm9tIGJvdGggbmV0cywgc28gZWxpbWluYXRlIHRoaXMKCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGEKCkNhbGFudXNfaHlwZXJib3JldXNfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KENhbGFudXNfaHlwZXJib3JldXNfRU1BLCBNRVNILCBHRUFSX05BTUUpCgpDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQV9HZWFyU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2FsYW51c19oeXBlcmJvcmV1c19FTUFfYnlHRUFSX05BTUUsIG4oKSkKCiNObyBpc3N1ZXMgd2l0aCBtaXNtYXRjaGVkIG1lc2ggYW5kIGdlYXIgc2l6ZXMuIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMKCkNhbGFudXNfaHlwZXJib3JldXNfRU1BIDwtIGZpbHRlcihDYWxhbnVzX2h5cGVyYm9yZXVzX0VNQSwgTUVTSCAhPSAxNTMpCgoKI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0CgpDYWxhbnVzX2h5cGVyYm9yZXVzIDwtIHJiaW5kKENhbGFudXNfaHlwZXJib3JldXNfRWNvREFBVCwgQ2FsYW51c19oeXBlcmJvcmV1c19FTUEpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDYWxhbnVzX2h5cGVyYm9yZXVzKQoKCmBgYAoKCkNhbGFudXMgbWFyc2hhbGxhZS9nbGFjaWFsaXMKCgpgYGB7cn0KCkNhbGFudXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQ2FsYW51cyBtYXJzaGFsbGFlL2dsYWNpYWxpcyIpCgojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzCgpDYWxhbnVzX0VNQSA8LSBmaWx0ZXIoQ2FsYW51cywgREFUQV9TT1VSQ0U9PSJFTUEiKQpDYWxhbnVzX0Vjb0RBQVQgPC0gZmlsdGVyKENhbGFudXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpCgojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQoKQ2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSA8LSBncm91cF9ieShDYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0sIE1FU0gsIEdFQVJfTkFNRSkKCkNhbGFudXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2FsYW51c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpCgojRG8gc29tZSBmaWx0ZXJpbmcgdG8gZ2V0IHRoZSBjb3JyZWN0IHN0YWdlcyBmcm9tIHRoZSBjb3JyZWN0IGdlYXIgZm9yIEVjb0RBQVQgZGF0YQoKQ2FsYW51c19FY29EQUFUX0IgPC0gZmlsdGVyKENhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkIiKQpDYWxhbnVzX0Vjb0RBQVRfQiA8LSBmaWx0ZXIoQ2FsYW51c19FY29EQUFUX0IsIE1FU0ghPTE1MykKCkNhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJDIikKQ2FsYW51c19FY29EQUFUX0MgPC0gZmlsdGVyKENhbGFudXNfRWNvREFBVF9DLCBNRVNIPT0xNTMpCkNhbGFudXNfRWNvREFBVF9DIDwtIGZpbHRlcihDYWxhbnVzX0Vjb0RBQVRfQywgR0VBUl9OQU1FPT0iMjBCT04iKQoKQ2FsYW51c19FY29EQUFUX0cgPC0gZmlsdGVyKENhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkciKQoKQ2FsYW51c19FY29EQUFUX0ggPC0gZmlsdGVyKENhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkgiKQoKQ2FsYW51c19FY29EQUFUX0sgPC0gZmlsdGVyKENhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IksiKQoKQ2FsYW51c19FY29EQUFUX0wgPC0gZmlsdGVyKENhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkwiKQoKI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0CgpDYWxhbnVzX0Vjb0RBQVRfRmluYWwgPC0gcmJpbmQoQ2FsYW51c19FY29EQUFUX0IsIENhbGFudXNfRWNvREFBVF9DLCBDYWxhbnVzX0Vjb0RBQVRfRywgQ2FsYW51c19FY29EQUFUX0gsIENhbGFudXNfRWNvREFBVF9LLCBDYWxhbnVzX0Vjb0RBQVRfTCkKCnVuZ3JvdXAoQ2FsYW51c19FY29EQUFUX0ZpbmFsKQoKI1JlbW92ZSBzb21lIGZpbGVzCgpybShDYWxhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLCBDYWxhbnVzX0Vjb0RBQVRfQiwgQ2FsYW51c19FY29EQUFUX0MsIENhbGFudXNfRWNvREFBVF9HLCBDYWxhbnVzX0Vjb0RBQVRfSCwgQ2FsYW51c19FY29EQUFUX0ssIENhbGFudXNfRWNvREFBVF9MKQoKI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcwoKI0NoZWNrIHRvIHNlZSBpZiB3aGF0IHN0YWdlcyBhcmUgd2hlcmUgd2l0aCBFTUEgZGF0YQoKQ2FsYW51c19FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoQ2FsYW51c19FTUEsIE1FU0gsIEdFQVJfTkFNRSkKCkNhbGFudXNfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShDYWxhbnVzX0VNQV9ieUdFQVJfTkFNRSwgbigpKQoKI05vIGlzc3VlcyB3aXRoIG1pc21hdGNoZWQgbWVzaCBhbmQgZ2VhciBzaXplcy4gTmVlZCB0byBmaWx0ZXIgZm9yIHRoZSBjb3JyZWN0IHN0YWdlcyBmb3IgYXZvaWQgZG91YmxlIGNvdW50cwoKQ2FsYW51c19FTUFfNjBCT04gPC0gZmlsdGVyKENhbGFudXNfRU1BLCBHRUFSX05BTUU9PSI2MEJPTiIpCgpDYWxhbnVzX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKENhbGFudXNfRU1BXzYwQk9OLCBNRVNIPT0zMzMpCgpDYWxhbnVzX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKENhbGFudXNfRU1BXzYwQk9OXzMzMywgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikifFNUQUdFX05BTUU9PSJDIC0gMyAoQ09QRVBPRElURSBJSUkpIikKCkNhbGFudXNfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoQ2FsYW51c19FTUFfNjBCT04sIE1FU0g9PTUwNSkKCkNhbGFudXNfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoQ2FsYW51c19FTUFfNjBCT05fNTA1LCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSIpCgpDYWxhbnVzX0VNQV8yMEJPTiA8LSBmaWx0ZXIoQ2FsYW51c19FTUEsIEdFQVJfTkFNRT09IjIwQk9OIikKCkNhbGFudXNfRU1BXzIwQk9OXzE1MyA8LSBmaWx0ZXIoQ2FsYW51c19FTUFfMjBCT04sIE1FU0g9PTE1MykKCkNhbGFudXNfRU1BXzIwQk9OXzE1MyA8LSBmaWx0ZXIoQ2FsYW51c19FTUFfMjBCT05fMTUzLCBTVEFHRV9OQU1FPT0iQyAtIDIgKENPUEVQT0RJVEUgSUkpInxTVEFHRV9OQU1FPT0iQyAtIDEgKENPUEVQT0RJVEUgSSkiKQoKI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0CgpDYWxhbnVzX0VNQV9GaW5hbCA8LSByYmluZChDYWxhbnVzX0VNQV82MEJPTl8zMzMsIENhbGFudXNfRU1BXzYwQk9OXzUwNSwgQ2FsYW51c19FTUFfMjBCT05fMTUzKQoKdW5ncm91cChDYWxhbnVzX0VNQV9GaW5hbCkKCiNSZW1vdmUgc29tZSBmaWxlcwoKcm0oQ2FsYW51c19FTUFfYnlHRUFSX05BTUUsIENhbGFudXNfRU1BXzIwQk9OLCBDYWxhbnVzX0VNQV8yMEJPTl8xNTMsIENhbGFudXNfRU1BXzYwQk9OLCBDYWxhbnVzX0VNQV82MEJPTl8zMzMsIENhbGFudXNfRU1BXzYwQk9OXzUwNSkKCiNDb21iaW5lIGludG8gZmluYWwsIENhbGFudXMgZGF0YSBzZXQKCkNhbGFudXMgPC0gcmJpbmQoQ2FsYW51c19FTUFfRmluYWwsIENhbGFudXNfRWNvREFBVF9GaW5hbCkKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2FsYW51cykKCgpgYGAKCgpDYWxhbnVzIHBhY2lmaWN1cwoKCmBgYHtyfQoKQ2FsYW51c19wYWNpZmljdXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFID09ICJDYWxhbnVzIHBhY2lmaWN1cyIpCgoKI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scwoKQ2FsYW51c19wYWNpZmljdXNfRU1BIDwtIGZpbHRlcihDYWxhbnVzX3BhY2lmaWN1cywgREFUQV9TT1VSQ0U9PSJFTUEiKQpDYWxhbnVzX3BhY2lmaWN1c19FY29EQUFUIDwtIGZpbHRlcihDYWxhbnVzX3BhY2lmaWN1cywgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikKCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhCgpDYWxhbnVzX3BhY2lmaWN1c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSA8LSBncm91cF9ieShDYWxhbnVzX3BhY2lmaWN1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpCgpDYWxhbnVzX3BhY2lmaWN1c19FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShDYWxhbnVzX3BhY2lmaWN1c19FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpCgojU3RhZ2VzIGFuZCBnZWFyIGFyZSBjb3JyZWN0IGZvciBFY29EQUFUIGRhdGEKCgojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzCgojQ2hlY2sgdG8gc2VlIGlmIHdoYXQgc3RhZ2VzIGFyZSB3aGVyZSB3aXRoIEVNQSBkYXRhCgpDYWxhbnVzX3BhY2lmaWN1c19FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoQ2FsYW51c19wYWNpZmljdXNfRU1BLCBNRVNILCBHRUFSX05BTUUpCgpDYWxhbnVzX3BhY2lmaWN1c19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKENhbGFudXNfcGFjaWZpY3VzX0VNQV9ieUdFQVJfTkFNRSwgbigpKQoKIyBOZWVkIHRvIGZpbHRlciBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZvciBhdm9pZCBkb3VibGUgY291bnRzLCBqdXN0IHJlbW92ZSBvbmUgSnVkYXkgc2FtcGxlCgpDYWxhbnVzX3BhY2lmaWN1c19FTUEgPC0gZmlsdGVyKENhbGFudXNfcGFjaWZpY3VzX0VNQSwgR0VBUl9OQU1FIT0iSnVkYXkiKQoKCgojQ29tYmluZSBpbnRvIGZpbmFsLCBDYWxhbnVzX3BhY2lmaWN1cyBkYXRhIHNldAoKQ2FsYW51c19wYWNpZmljdXMgPC0gcmJpbmQoQ2FsYW51c19wYWNpZmljdXNfRU1BLCBDYWxhbnVzX3BhY2lmaWN1c19FY29EQUFUKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDYWxhbnVzX3BhY2lmaWN1cykKCgoKCmBgYAoKQ2FyaWRlYQoKYGBge3J9CgpDYXJpZGVhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRSA9PSAiQ2FyaWRlYSIpCgojQ2FyaWRlYSBlc3RpbWF0ZSBmcm9tIGxhcmdlciBuZXRzIG9ubHkKCkNhcmlkZWEgPC0gZmlsdGVyKENhcmlkZWEsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2FyaWRlYSkKCgpgYGAKQ2VudHJvcGFnZXMgYWJkb21pbmFsaXMKCmBgYHtyfQoKQ2VudHJvcGFnZXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQ2VudHJvcGFnZXMgYWJkb21pbmFsaXMiKQoKCiNTZXBhcmF0ZSBFTUEgZGF0YSBhcyB0aGV5IHdlcmUgc29ydGVkIHVuZGVyIGRpZmZlcmVudCBwcm90b2NvbHMKCkNlbnRyb3BhZ2VzX0VNQSA8LSBmaWx0ZXIoQ2VudHJvcGFnZXMsIERBVEFfU09VUkNFPT0iRU1BIikKQ2VudHJvcGFnZXNfRWNvREFBVCA8LSBmaWx0ZXIoQ2VudHJvcGFnZXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpCgojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQoKQ2VudHJvcGFnZXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoQ2VudHJvcGFnZXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQoKQ2VudHJvcGFnZXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2VudHJvcGFnZXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQoKCiNGaWx0ZXIgZm9yIGNvcnJlY3QgR0VBUl9OQU1FIGFuZCBNRVNIIGZyb20gRWNvREFBVAoKQ2VudHJvcGFnZXNfRWNvREFBVCA8LSBmaWx0ZXIoQ2VudHJvcGFnZXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSE9IkciKQoKCiNOb3cgZmlsdGVyIHRoZSBFTUEgZGF0YSB0byBtYXRjaCB0aGUgRWNvREFBVCBkYXRhLiBFTUEgdGVuZHMgdG8gZG91YmxlIGNvdW50IHZhcmlhYmxlcyBmcm9tIGJvdGggbmV0cywgc28gZWxpbWluYXRlIHRoaXMKCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGEKCkNlbnRyb3BhZ2VzX0VNQV9ieUdFQVJfTkFNRSA8LSBncm91cF9ieShDZW50cm9wYWdlc19FTUEsIE1FU0gsIEdFQVJfTkFNRSkKCkNlbnRyb3BhZ2VzX0VNQV9HZWFyU3VtbWFyeSA8LSBzdW1tYXJpc2UoQ2VudHJvcGFnZXNfRU1BX2J5R0VBUl9OQU1FLCBuKCkpCgojRm9yIGNvbnNpc3RlbmN5LCBzZWxlY3QgdGhlIHNtYWxsZXIgZ2VhciBvbmx5CgpDZW50cm9wYWdlc19FTUEgPC0gZmlsdGVyKENlbnRyb3BhZ2VzX0VNQSwgR0VBUl9OQU1FIT0iNjBCT04iKQoKCiNSZWNvbWJpbmVkIGRhdGEKCkNlbnRyb3BhZ2VzIDwtIHJiaW5kKENlbnRyb3BhZ2VzX0Vjb0RBQVQsIENlbnRyb3BhZ2VzX0VNQSkKCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDZW50cm9wYWdlcykKCgoKCgpgYGAKCkNoYWV0b2duYXRoYQoKYGBge3J9CgpDaGFldG9nbmF0aGEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQ2hhZXRvZ25hdGhhIikKCiNGaWx0ZXIgZm9yIENoYWV0b2duYXRoYSBmcm9tIHRoZSA2MEJPTiBuZXRzIG9ubHkKCkNoYWV0b2duYXRoYSA8LSBmaWx0ZXIoQ2hhZXRvZ25hdGhhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENoYWV0b2duYXRoYSkKCgoKYGBgCgpDaXJyaXBlZGlhCgpgYGB7cn0KCkNpcnJpcGVkaWEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFID09ICJDaXJyaXBlZGlhIikKCiNDYW4gZmlsdGVyIGZvciBib3RoIGdlYXJzIGFuZCB0aGVuIGFkZCBhIHRheGEgY29hcnNlIG9mIENpcnJpcGVkaWFfbGFyZ2UgYW5kIENpcnJpcGVkaWFfc21hbGwKCkNpcnJpcGVkaWFfbGFyZ2UgPC0gZmlsdGVyKENpcnJpcGVkaWEsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNSZWNvZGUgY29hcnNlIHRheGEKCkNpcnJpcGVkaWFfbGFyZ2UkVEFYQV9DT0FSU0VbQ2lycmlwZWRpYV9sYXJnZSRUQVhBX0NPQVJTRT09IkNpcnJpcGVkaWEiXSA8LSAiQ2lycmlwZWRpYV9sYXJnZSIKCgpDaXJyaXBlZGlhX3NtYWxsIDwtIGZpbHRlcihDaXJyaXBlZGlhLCBHRUFSX05BTUUhPSI2MEJPTiIpCgojUmVjb2RlIGNvYXJzZSB0YXhhCgpDaXJyaXBlZGlhX3NtYWxsJFRBWEFfQ09BUlNFW0NpcnJpcGVkaWFfc21hbGwkVEFYQV9DT0FSU0U9PSJDaXJyaXBlZGlhIl0gPC0gIkNpcnJpcGVkaWFfc21hbGwiCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENpcnJpcGVkaWFfbGFyZ2UsIENpcnJpcGVkaWFfc21hbGwpCgoKCgpgYGAKCkNsYWRvY2VyYQoKYGBge3J9CgpDbGFkb2NlcmEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQ2xhZG9jZXJhIikKCiNDbGFkb2NlcmEgZnJvbXQgaGUgc21hbGwgbmV0IG9ubHkKCiNGaWx0ZXIgZm9yIGNvcnJlY3QgZ2VhcgoKQ2xhZG9jZXJhIDwtIGZpbHRlcihDbGFkb2NlcmEsIEdFQVJfTkFNRSE9ICI2MEJPTiIpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDbGFkb2NlcmEpCgoKYGBgCgpDbGlvbmUgbGltYWNpbmEKCmBgYHtyfQoKQ2xpb25lIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkNsaW9uZSBsaW1hY2luYSIpCgojRXN0aW1hdGUgZnJvbSB0aGUgbGFyZ2VyIG5ldCBvbmx5CgpDbGlvbmUgPC0gZmlsdGVyKENsaW9uZSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ2xpb25lKQoKCgoKCmBgYAoKQ25pZGFyaWEKCmBgYHtyfQoKQ25pZGFyaWEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFID09ICJDbmlkYXJpYSIpCgojQ2FuIGZpbHRlciBmb3IgYm90aCBnZWFycyBhbmQgdGhlbiBhZGQgYSB0YXhhIGNvYXJzZSBvZiBDbmlkYXJpYV9sYXJnZSBhbmQgQ25pZGFyaWFfc21hbGwKCkNuaWRhcmlhX2xhcmdlIDwtIGZpbHRlcihDbmlkYXJpYSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKI1JlY29kZSBjb2Fyc2UgdGF4YQoKQ25pZGFyaWFfbGFyZ2UkVEFYQV9DT0FSU0VbQ25pZGFyaWFfbGFyZ2UkVEFYQV9DT0FSU0U9PSJDbmlkYXJpYSJdIDwtICJDbmlkYXJpYV9sYXJnZSIKCgpDbmlkYXJpYV9zbWFsbCA8LSBmaWx0ZXIoQ25pZGFyaWEsIEdFQVJfTkFNRSE9IjYwQk9OIikKCiNSZWNvZGUgY29hcnNlIHRheGEKCkNuaWRhcmlhX3NtYWxsJFRBWEFfQ09BUlNFW0NuaWRhcmlhX3NtYWxsJFRBWEFfQ09BUlNFPT0iQ25pZGFyaWEiXSA8LSAiQ25pZGFyaWFfc21hbGwiCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDbmlkYXJpYV9sYXJnZSwgQ25pZGFyaWFfc21hbGwpCgoKCmBgYAoKU21hbGwgYW5kIGxhcmdlIGNvcGVwb2RzIHRoYXQgZG8gbm90IGJlbG9uZyB0byBtYWpvciB0YXhvbm9taWMgZ3JvdXAKCgpgYGB7cn0KCgpDb3BlcG9kX3NtYWxsIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRSA9PSAiQ29wZXBvZF9zbWFsbCIpCgojRmlsdGVyIGZvciB0aGUgc21hbGxlciBtZXNoIGdlYXJzIG9ubHkKCkNvcGVwb2Rfc21hbGwgPC0gZmlsdGVyKENvcGVwb2Rfc21hbGwsIEdFQVJfTkFNRSE9IjYwQk9OIikKCiNOb3cgYnVpbGQgdGhlIGxhcmdlIGRhdGFzZXQKCkNvcGVwb2RfbGFyZ2UgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFID09ICJDb3BlcG9kX2xhcmdlIikKCiNGaWx0ZXIgZm9yIHRoZSBzbWFsbGVyIG1lc2ggZ2VhcnMgb25seQoKQ29wZXBvZF9sYXJnZSA8LSBmaWx0ZXIoQ29wZXBvZF9sYXJnZSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBDb3BlcG9kX2xhcmdlLCBDb3BlcG9kX3NtYWxsKQoKCgpgYGAKCgpDdGVub3Bob3JhCgpgYGB7cn0KCkN0ZW5vcGhvcmEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iQ3Rlbm9waG9yYSIpCgojRmlsdGVyIGZvciB0aGUgbGFyZ2UgbmV0IG9ubHkKCkN0ZW5vcGhvcmEgPC0gZmlsdGVyKEN0ZW5vcGhvcmEsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQ3Rlbm9waG9yYSkKCgoKYGBgCgoKQ3VtYWNlYQoKYGBge3J9CgpDdW1hY2VhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkN1bWFjZWEiKQoKI0ZpbHRlciBmb3IgdGhlIGxhcmdlIG5ldCBvbmx5CgpDdW1hY2VhIDwtIGZpbHRlcihDdW1hY2VhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEN1bWFjZWEpCgoKCmBgYAoKCkRlY2Fwb2RhCgoKYGBge3J9CgpEZWNhcG9kYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJEZWNhcG9kYSIpCgojVmVyeSBmZXcgbWVhc3VyZW1lbnRzIG9mIHVuaWRlbnRmaWVkIGRlY2Fwb2RzLiBXZSBjYW4gaWdub3JlCgpgYGAKCgpFY2hpbm9kZXJtYXRhCgpgYGB7cn0KCkVjaGlub2Rlcm1hdGEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iRWNoaW5vZGVybWF0YSIpCgojRWNoaW5vZGVybWF0YSBhcmUgdGlueSwgZmlsdGVyIGZyb20gc21hbGwgbmV0cyBvbmx5CgpFY2hpbm9kZXJtYXRhIDwtIGZpbHRlcihFY2hpbm9kZXJtYXRhLCBHRUFSX05BTUUhPSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEVjaGlub2Rlcm1hdGEpCgoKCgpgYGAKCgpFcGlsYWJpZG9jZXJhIGxvbmdpcGVkYXRhCgpgYGB7cn0KCkVwaWxhYmlkb2NlcmEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iRXBpbGFiaWRvY2VyYSBsb25naXBlZGF0YSIpCgoKI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scwoKRXBpbGFiaWRvY2VyYV9FTUEgPC0gZmlsdGVyKEVwaWxhYmlkb2NlcmEsIERBVEFfU09VUkNFPT0iRU1BIikKRXBpbGFiaWRvY2VyYV9FY29EQUFUIDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhLCBEQVRBX1NPVVJDRT09IkVjb0RBQVQiKQoKI0NoZWNrIHRvIHNlZSBpZiByaWdodCBzdGFnZXMgYXJlIGluIHRoZSBFY29EQUFUIGRhdGEKCkVwaWxhYmlkb2NlcmFfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoRXBpbGFiaWRvY2VyYV9FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpCgpFcGlsYWJpZG9jZXJhX0Vjb0RBQVRfRm9ybVN1bW1hcnkgPC0gc3VtbWFyaXNlKEVwaWxhYmlkb2NlcmFfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQoKI1RoaW5ncyBhcmUgY29ycmVjdCBmb3IgdGhlIEVjb0RBQVQgZGF0YSwgbm90IGxvb2sgYXQgdGhlIEVNQSBkYXRhCgoKI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcwoKI0NoZWNrIHRvIHNlZSBpZiB3aGF0IHN0YWdlcyBhcmUgd2hlcmUgd2l0aCBFTUEgZGF0YQoKRXBpbGFiaWRvY2VyYV9FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoRXBpbGFiaWRvY2VyYV9FTUEsIE1FU0gsIEdFQVJfTkFNRSkKCkVwaWxhYmlkb2NlcmFfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShFcGlsYWJpZG9jZXJhX0VNQV9ieUdFQVJfTkFNRSwgbigpKQoKCgojTm8gaXNzdWVzIHdpdGggbWlzbWF0Y2hlZCBtZXNoIGFuZCBnZWFyIHNpemVzLiBOZWVkIHRvIGZpbHRlciBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZvciBhdm9pZCBkb3VibGUgY291bnRzCgpFcGlsYWJpZG9jZXJhX0VNQV82MEJPTiA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUEsIEdFQVJfTkFNRT09IjYwQk9OIikKCkVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzMzMyA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUFfNjBCT04sIE1FU0g9PTMzMykKCkVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzMzMyA8LSBmaWx0ZXIoRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fMzMzLCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkiKQoKRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fNTA1IDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhX0VNQV82MEJPTiwgTUVTSD09NTA1KQoKRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fNTA1IDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhX0VNQV82MEJPTl81MDUsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpIikKCkVwaWxhYmlkb2NlcmFfRU1BXzIwQk9OIDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhX0VNQSwgR0VBUl9OQU1FPT0iMjBCT04iKQoKRXBpbGFiaWRvY2VyYV9FTUFfMjBCT05fMTUzIDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhX0VNQV8yMEJPTiwgTUVTSD09MTUzKQoKRXBpbGFiaWRvY2VyYV9FTUFfMjBCT05fMTUzIDwtIGZpbHRlcihFcGlsYWJpZG9jZXJhX0VNQV8yMEJPTl8xNTMsIFNUQUdFX05BTUU9PSJDIC0gMiAoQ09QRVBPRElURSBJSSkifFNUQUdFX05BTUU9PSJDIC0gMSAoQ09QRVBPRElURSBJKSIpCgojVGhlIG90aGVyIGdlYXJzIGFyZSBjb3JyZWN0LCBzbyByZWJ1aWxkIGRhdGFzZXQKCkVwaWxhYmlkb2NlcmFfRU1BX0ZpbmFsIDwtIHJiaW5kKEVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzMzMywgRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fNTA1LCBFcGlsYWJpZG9jZXJhX0VNQV8yMEJPTl8xNTMpCgp1bmdyb3VwKEVwaWxhYmlkb2NlcmFfRU1BX0ZpbmFsKQoKI1JlbW92ZSBzb21lIGZpbGVzCgpybShFcGlsYWJpZG9jZXJhX0VNQV9ieUdFQVJfTkFNRSwgRXBpbGFiaWRvY2VyYV9FTUFfMjBCT04sIEVwaWxhYmlkb2NlcmFfRU1BXzIwQk9OXzE1MywgRXBpbGFiaWRvY2VyYV9FTUFfNjBCT04sIEVwaWxhYmlkb2NlcmFfRU1BXzYwQk9OXzMzMywgRXBpbGFiaWRvY2VyYV9FTUFfNjBCT05fNTA1KQoKI0NvbWJpbmUgaW50byBmaW5hbCwgRXBpbGFiaWRvY2VyYSBkYXRhIHNldAoKRXBpbGFiaWRvY2VyYSA8LSByYmluZChFcGlsYWJpZG9jZXJhX0VNQV9GaW5hbCwgRXBpbGFiaWRvY2VyYV9FY29EQUFUKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBFcGlsYWJpZG9jZXJhKQoKCmBgYAoKRXVjYWxhbnVzIGJ1bmdpaQoKYGBge3J9CgpFdWNhbGFudXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iRXVjYWxhbnVzIGJ1bmdpaSIpCgoKI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scwoKRXVjYWxhbnVzX0VNQSA8LSBmaWx0ZXIoRXVjYWxhbnVzLCBEQVRBX1NPVVJDRT09IkVNQSIpCkV1Y2FsYW51c19FY29EQUFUIDwtIGZpbHRlcihFdWNhbGFudXMsIERBVEFfU09VUkNFPT0iRWNvREFBVCIpCgojQ2hlY2sgdG8gc2VlIGlmIHJpZ2h0IHN0YWdlcyBhcmUgaW4gdGhlIEVjb0RBQVQgZGF0YQoKRXVjYWxhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpCgpFdWNhbGFudXNfRWNvREFBVF9Gb3JtU3VtbWFyeSA8LSBzdW1tYXJpc2UoRXVjYWxhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLG4oKSkKCgoKI0RvIHNvbWUgZmlsdGVyaW5nIHRvIGdldCB0aGUgY29ycmVjdCBzdGFnZXMgZnJvbSB0aGUgY29ycmVjdCBnZWFyIGZvciBFY29EQUFUIGRhdGEKCkV1Y2FsYW51c19FY29EQUFUX0EgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQSIpCkV1Y2FsYW51c19FY29EQUFUX0EgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFUX0EsIE1FU0ghPTE1MykKCkV1Y2FsYW51c19FY29EQUFUX0IgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQiIpCkV1Y2FsYW51c19FY29EQUFUX0IgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFUX0IsIE1FU0ghPTE1MykKCkV1Y2FsYW51c19FY29EQUFUX0MgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQyIpCkV1Y2FsYW51c19FY29EQUFUX0MgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFUX0MsIE1FU0g9PTE1MykKCkV1Y2FsYW51c19FY29EQUFUX0YgPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iRiIpCgoKRXVjYWxhbnVzX0Vjb0RBQVRfRyA8LSBmaWx0ZXIoRXVjYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJHIikKCkV1Y2FsYW51c19FY29EQUFUX0ggPC0gZmlsdGVyKEV1Y2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iSCIpCgpFdWNhbGFudXNfRWNvREFBVF9LIDwtIGZpbHRlcihFdWNhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IksiKQoKRXVjYWxhbnVzX0Vjb0RBQVRfTCA8LSBmaWx0ZXIoRXVjYWxhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJMIikKCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldAoKRXVjYWxhbnVzX0Vjb0RBQVRfRmluYWwgPC0gcmJpbmQoRXVjYWxhbnVzX0Vjb0RBQVRfQSwgRXVjYWxhbnVzX0Vjb0RBQVRfQiwgRXVjYWxhbnVzX0Vjb0RBQVRfQywgRXVjYWxhbnVzX0Vjb0RBQVRfRiwgIEV1Y2FsYW51c19FY29EQUFUX0csIEV1Y2FsYW51c19FY29EQUFUX0gsIEV1Y2FsYW51c19FY29EQUFUX0ssIEV1Y2FsYW51c19FY29EQUFUX0wpCgp1bmdyb3VwKEV1Y2FsYW51c19FY29EQUFUX0ZpbmFsKQoKI1JlbW92ZSBzb21lIGZpbGVzCgpybShFdWNhbGFudXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sIEV1Y2FsYW51c19FY29EQUFUX0EsIEV1Y2FsYW51c19FY29EQUFUX0IsIEV1Y2FsYW51c19FY29EQUFUX0MsIEV1Y2FsYW51c19FY29EQUFUX0YsIEV1Y2FsYW51c19FY29EQUFUX0csIEV1Y2FsYW51c19FY29EQUFUX0gsIEV1Y2FsYW51c19FY29EQUFUX0ssIEV1Y2FsYW51c19FY29EQUFUX0wpCgoKCiNOb3cgZmlsdGVyIHRoZSBFTUEgZGF0YSB0byBtYXRjaCB0aGUgRWNvREFBVCBkYXRhLiBFTUEgdGVuZHMgdG8gZG91YmxlIGNvdW50IHZhcmlhYmxlcyBmcm9tIGJvdGggbmV0cywgc28gZWxpbWluYXRlIHRoaXMKCiNDaGVjayB0byBzZWUgaWYgd2hhdCBzdGFnZXMgYXJlIHdoZXJlIHdpdGggRU1BIGRhdGEKCkV1Y2FsYW51c19FTUFfYnlHRUFSX05BTUUgPC0gZ3JvdXBfYnkoRXVjYWxhbnVzX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQoKRXVjYWxhbnVzX0VNQV9HZWFyU3VtbWFyeSA8LSBzdW1tYXJpc2UoRXVjYWxhbnVzX0VNQV9ieUdFQVJfTkFNRSwgbigpKQoKI05vIGlzc3VlcyB3aXRoIG1pc21hdGNoZWQgbWVzaCBhbmQgZ2VhciBzaXplcy4gTmVlZCB0byBmaWx0ZXIgZm9yIHRoZSBjb3JyZWN0IHN0YWdlcyBmb3IgYXZvaWQgZG91YmxlIGNvdW50cwoKRXVjYWxhbnVzX0VNQV82MEJPTiA8LSBmaWx0ZXIoRXVjYWxhbnVzX0VNQSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKRXVjYWxhbnVzX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKEV1Y2FsYW51c19FTUFfNjBCT04sIE1FU0g9PTMzMykKCkV1Y2FsYW51c19FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihFdWNhbGFudXNfRU1BXzYwQk9OXzMzMywgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikifFNUQUdFX05BTUU9PSJDIC0gMyAoQ09QRVBPRElURSBJSUkpIikKCkV1Y2FsYW51c19FTUFfNjBCT05fNTA1IDwtIGZpbHRlcihFdWNhbGFudXNfRU1BXzYwQk9OLCBNRVNIPT01MDUpCgpFdWNhbGFudXNfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoRXVjYWxhbnVzX0VNQV82MEJPTl81MDUsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpInxTVEFHRV9OQU1FPT0iQyAtIDMgKENPUEVQT0RJVEUgSUlJKSIpCgpFdWNhbGFudXNfRU1BXzIwQk9OIDwtIGZpbHRlcihFdWNhbGFudXNfRU1BLCBHRUFSX05BTUU9PSIyMEJPTiIpCgpFdWNhbGFudXNfRU1BXzIwQk9OXzE1MyA8LSBmaWx0ZXIoRXVjYWxhbnVzX0VNQV8yMEJPTiwgTUVTSD09MTUzKQoKRXVjYWxhbnVzX0VNQV8yMEJPTl8xNTMgPC0gZmlsdGVyKEV1Y2FsYW51c19FTUFfMjBCT05fMTUzLCBTVEFHRV9OQU1FPT0iQyAtIDIgKENPUEVQT0RJVEUgSUkpInxTVEFHRV9OQU1FPT0iQyAtIDEgKENPUEVQT0RJVEUgSSkiKQoKI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0CgpFdWNhbGFudXNfRU1BX0ZpbmFsIDwtIHJiaW5kKEV1Y2FsYW51c19FTUFfNjBCT05fMzMzLCBFdWNhbGFudXNfRU1BXzYwQk9OXzUwNSwgRXVjYWxhbnVzX0VNQV8yMEJPTl8xNTMpCgp1bmdyb3VwKEV1Y2FsYW51c19FTUFfRmluYWwpCgojUmVtb3ZlIHNvbWUgZmlsZXMKCnJtKEV1Y2FsYW51c19FTUFfYnlHRUFSX05BTUUsIEV1Y2FsYW51c19FTUFfMjBCT04sIEV1Y2FsYW51c19FTUFfMjBCT05fMTUzLCBFdWNhbGFudXNfRU1BXzYwQk9OLCBFdWNhbGFudXNfRU1BXzYwQk9OXzMzMywgRXVjYWxhbnVzX0VNQV82MEJPTl81MDUpCgojQ29tYmluZSBpbnRvIGZpbmFsLCBFdWNhbGFudXMgZGF0YSBzZXQKCkV1Y2FsYW51cyA8LSByYmluZChFdWNhbGFudXNfRU1BX0ZpbmFsLCBFdWNhbGFudXNfRWNvREFBVF9GaW5hbCkKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEV1Y2FsYW51cykKCgoKYGBgCgpFdXBoYXVzaWFjZWEgcGFjaWZpY2EgCgpgYGB7cn0KCkVfcGFjaWZpY2EgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iRXVwaGF1c2lhIHBhY2lmaWNhIikKCiNGaWx0ZXIgZm9yIGxhcmdlIG5ldCBvbmx5IGFuZCBzdGFnZXMgYXJlIGFkdWx0IGFuZCBqdXZlbmlsZQoKRV9wYWNpZmljYSA8LSBmaWx0ZXIoRV9wYWNpZmljYSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBFX3BhY2lmaWNhKQoKCgpgYGAKCgpFdXBoYXVzaWFjZWEKCmBgYHtyfQoKRXVwaGF1c2lhY2VhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IkV1cGhhdXNpYWNlYSIpCgojRmlyc3Qgc2VwYXJhdGUgb3V0IHRoZSBhZHVsdHMgYmVsb25naW5nIHRvIFRlc3NhcmJyYW5jaGlvbiBvY3VsYXR1bQoKCQpUZXNzYXJhYnJhY2hpb25fb2N1bGF0dW0gPC0gZmlsdGVyIChFdXBoYXVzaWFjZWEsIFRBWE9OX05BTUU9PSJUZXNzYXJhYnJhY2hpb24gb2N1bGF0dW0iKQoKCiNOb3cgZmlsdGVyIHRoZSBFdXBoYXVzaWFjZWEgZm9yIHRoZSBjb3JyZWN0IHN0YWdlcyBhbmQgbmV0cwoKRXVwaGF1c2lhY2VhIDwtIGZpbHRlcihFdXBoYXVzaWFjZWEsIFRBWE9OX05BTUUhPSJUZXNzYXJhYnJhY2hpb24gb2N1bGF0dW0iKQoKI0VsaW1pbmF0ZSBhZHVsdCBhbmQganV2ZW5pbGUgc3RhZ2VzLCB0aG9zZSBzaG91bGQgYmUgaWRlbnRpZmllZCB0byBzcGVjaWVzCgpFdXBoYXVzaWFjZWEgPC0gZmlsdGVyKEV1cGhhdXNpYWNlYSwgU1RBR0VfTkFNRSE9ICJBICsgSiAoQURVTFQvSlVWRU5JTEUpIikKCkV1cGhhdXNpYWNlYSA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBTVEFHRV9OQU1FIT0gIkpVVkVOSUxFIikKCiNHZXQgcmlkIG9mIHRoZSBOT1QgREVURVJNSU5FRAoKRXVwaGF1c2lhY2VhIDwtIGZpbHRlcihFdXBoYXVzaWFjZWEsIFNUQUdFX05BTUUhPSJOT1QgREVURVJNSU5FRCIpCgojR2V0IHJpZCBvZiB0aGUgRUdHCgpFdXBoYXVzaWFjZWEgPC0gZmlsdGVyKEV1cGhhdXNpYWNlYSwgU1RBR0VfTkFNRSE9IkVHRyIpCgoKI05vdyBjcmVhdGUgdGhlIGZ1cmNpbGlhIGRhdGFzZXQKCkV1cGhhdXNpYWNlYV9mdXJjaWxpYSA8LSBmaWx0ZXIoRXVwaGF1c2lhY2VhLCBTVEFHRV9OQU1FPT0iRlVSQ0lMSUEiKQoKRXVwaGF1c2lhY2VhX2Z1cmNpbGlhIDwtIGZpbHRlcihFdXBoYXVzaWFjZWEsIEdFQVJfTkFNRT09IjYwQk9OIikKCgojTm93IGNyZWF0ZSB0aGUgY2FseXRvcGlzIGRhdGFzZXQKCkV1cGhhdXNpYWNlYV9jYWx5cHRvcGlzIDwtIGZpbHRlcihFdXBoYXVzaWFjZWEsIFNUQUdFX05BTUU9PSJDQUxZUFRPUElTIChTVEFHRSBOT1QgREVURVJNSU5FRCkifFNUQUdFX05BTUU9PSJDQUxZUFRPUElTIDEifFNUQUdFX05BTUU9PSJDQUxZUFRPUElTIDIifFNUQUdFX05BTUU9PSJDQUxZUFRPUElTIDMiKQoKCiNOb3cgY3JlYXRlIHRoZSBuYXVwbGl1cyBkYXRhc2V0CgpFdXBoYXVzaWFjZWFfbmF1cGxpdXMgPC0gZmlsdGVyKEV1cGhhdXNpYWNlYSwgU1RBR0VfTkFNRT09Ik5BVVBMSVVTIikKCiNGaWx0ZXIgZm9yIHNtYWxsIG5ldHMgb25seQoKRXVwaGF1c2lhY2VhX25hdXBsaXVzIDwtIGZpbHRlcihFdXBoYXVzaWFjZWFfbmF1cGxpdXMsIEdFQVJfTkFNRSE9IjYwQk9OIikKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEV1cGhhdXNpYWNlYV9mdXJjaWxpYSwgRXVwaGF1c2lhY2VhX2NhbHlwdG9waXMsIEV1cGhhdXNpYWNlYV9uYXVwbGl1cykKCgoKYGBgCgoKRXVyeXRlbW9yYSBzcHAuCgpgYGB7cn0KCkV1cnl0ZW1vcmEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iRXVyeXRlbW9yYSBzcHAuIikKCiNGaWx0ZXIgZnJvbSB0aGUgc21hbGwgbmV0cyBvbmx5CgpFdXJ5dGVtb3JhIDwtIGZpbHRlcihFdXJ5dGVtb3JhLCBHRUFSX05BTUUhPSI2MEJPTiIpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBFdXJ5dGVtb3JhKQoKCgpgYGAKCgpHYXN0cm9wb2RhCgoKYGBge3J9CgpHYXN0cm9wb2RhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ikdhc3Ryb3BvZGEiKQoKI1VuaWRlbnRpZmllZCBnYXN0cm9wb2RzLCBjYW4gcmVtb3ZlIGZyb20gZmluYWwgZGF0YXNldAoKCmBgYAoKCkxpbWFjaW5hIGhlbGljaW5hCgoKYGBge3J9CgpMaW1hY2luYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJMaW1hY2luYSBoZWxpY2luYSIpCgojQ2FuIHNwbGl0IGludG8gZXN0aWFtdGVzIGZyb20gbGFyZ2UgYW5kIHNtYWxsIG5ldHMKCgpMaW1hY2luYV9sYXJnZSA8LSBmaWx0ZXIoTGltYWNpbmEsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNSZW5hbWUgdGhlIGNvYXJzZSB0YXhhCgpMaW1hY2luYV9sYXJnZSRUQVhBX0NPQVJTRVtMaW1hY2luYV9sYXJnZSRUQVhBX0NPQVJTRT09IkxpbWFjaW5hIGhlbGljaW5hIl0gPC0gIkxpbWFjaW5hX2xhcmdlIgoKI05vdyBkbyB0aGUgc21hbGwgbmV0cwoKTGltYWNpbmFfc21hbGwgPC0gZmlsdGVyKExpbWFjaW5hLCBHRUFSX05BTUUhPSI2MEJPTiIpCgojUmVuYW1lIHRoZSBjb2Fyc2UgdGF4YQoKTGltYWNpbmFfc21hbGwkVEFYQV9DT0FSU0VbTGltYWNpbmFfc21hbGwkVEFYQV9DT0FSU0U9PSJMaW1hY2luYSBoZWxpY2luYSJdIDwtICJMaW1hY2luYV9zbWFsbCIKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIExpbWFjaW5hX2xhcmdlLCBMaW1hY2luYV9zbWFsbCkKCgoKYGBgCgpNZXRyaWRpYSBsb25nYQoKYGBge3J9CgpNZXRyaWRpYV9sb25nYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJNZXRyaWRpYSBsb25nYSIpCgojQWR1bHRzLCBDNSBvbmx5IHNvIGFsbCBpcyBnb29kLCBjYW4gYWRkIHRvIGZ1bGwgZGF0YSBzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIE1ldHJpZGlhX2xvbmdhKQoKCmBgYAoKCk1ldHJpZGlhIG9raG90ZW5zaXMKCgpgYGB7cn0KCk1ldHJpZGlhX29raG90ZW5zaXMgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iTWV0cmlkaWEgb2tob3RlbnNpcyIpCgoKI0FkdWx0cywgQzQsIGFuZCBDNSBvbmx5IHNvIGFsbCBpcyBnb29kLCBjYW4gYWRkIHRvIGZ1bGwgZGF0YSBzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIE1ldHJpZGlhX29raG90ZW5zaXMpCgoKCgpgYGAKCk1ldHJpZGlhIHBhY2lmaWNhCgoKYGBge3J9CgpNZXRyaWRpYV9wYWNpZmljYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJNZXRyaWRpYSBwYWNpZmljYSIpCgoKI1NlcGFyYXRlIEVNQSBkYXRhIGFzIHRoZXkgd2VyZSBzb3J0ZWQgdW5kZXIgZGlmZmVyZW50IHByb3RvY29scwoKTWV0cmlkaWFfcGFjaWZpY2FfRU1BIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYSwgREFUQV9TT1VSQ0U9PSJFTUEiKQpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYSwgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikKCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhCgpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSA8LSBncm91cF9ieShNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFULCBTUEVDSU1FTl9GT1JNLCBNRVNILCBHRUFSX05BTUUpCgpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX2J5U1BFQ0lNRU5fRk9STSxuKCkpCgojRG8gc29tZSBmaWx0ZXJpbmcgdG8gZ2V0IHRoZSBjb3JyZWN0IHN0YWdlcyBmcm9tIHRoZSBjb3JyZWN0IGdlYXIgZm9yIEVjb0RBQVQgZGF0YQoKTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9CIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQiIpCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfQiA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9CLCBNRVNIIT0xNTMpCgpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0MgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJDIikKCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfRyA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkciKQoKCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfSCA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkgiKQoKI1JlbW92ZSBDMyBzdGFnZQoKTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9IIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0gsIFNUQUdFX05BTUUhPSJDIC0gMyAoQ09QRVBPRElURSBJSUkpIikKCgpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0sgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJLIikKCk1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfTCA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkwiKQoKI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0CgpNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0ZpbmFsIDwtIHJiaW5kKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfQiwgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9DLCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0csIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfSCwgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9LLCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0wpCgp1bmdyb3VwKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfRmluYWwpCgojUmVtb3ZlIHNvbWUgZmlsZXMKCnJtKE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0IsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfQywgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9HLCBNZXRyaWRpYV9wYWNpZmljYV9FY29EQUFUX0gsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfSywgTWV0cmlkaWFfcGFjaWZpY2FfRWNvREFBVF9MKQoKI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcwoKI0NoZWNrIHRvIHNlZSBpZiB3aGF0IHN0YWdlcyBhcmUgd2hlcmUgd2l0aCBFTUEgZGF0YQoKTWV0cmlkaWFfcGFjaWZpY2FfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KE1ldHJpZGlhX3BhY2lmaWNhX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQoKTWV0cmlkaWFfcGFjaWZpY2FfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShNZXRyaWRpYV9wYWNpZmljYV9FTUFfYnlHRUFSX05BTUUsIG4oKSkKCiNObyBpc3N1ZXMgd2l0aCBtaXNtYXRjaGVkIG1lc2ggYW5kIGdlYXIgc2l6ZXMuIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMKCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTiA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRU1BLCBHRUFSX05BTUU9PSI2MEJPTiIpCgpNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FTUFfNjBCT04sIE1FU0g9PTMzMykKCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTl8zMzMsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpInxTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpIikKCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTl81MDUgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTiwgTUVTSD09NTA1KQoKTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzUwNSwgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikifFNUQUdFX05BTUU9PSJDIC0gNCAoQ09QRVBPRElURSBJVikiKQoKCgpNZXRyaWRpYV9wYWNpZmljYV9FTUFfc21hbGxuZXRzIDwtIGZpbHRlcihNZXRyaWRpYV9wYWNpZmljYV9FTUEsIEdFQVJfTkFNRSE9IjYwQk9OIikKCk1ldHJpZGlhX3BhY2lmaWNhX0VNQV9zbWFsbG5ldHMgPC0gZmlsdGVyKE1ldHJpZGlhX3BhY2lmaWNhX0VNQV9zbWFsbG5ldHMsIFNUQUdFX05BTUU9PSJDIC0gMSAoQ09QRVBPRElURSBJKSJ8U1RBR0VfTkFNRT09IkMgLSAyIChDT1BFUE9ESVRFIElJKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkiKQoKI1JlbmFtZSBNZXRyaWRpYSBwYWNpZmljIG9mIGVhcmx5IHN0YWdlcyBhcyBNZXRyaWRpYSBzcHAuCgpNZXRyaWRpYV9wYWNpZmljYV9FTUFfc21hbGxuZXRzJFRBWEFfQ09BUlNFW01ldHJpZGlhX3BhY2lmaWNhX0VNQV9zbWFsbG5ldHMkVEFYQV9DT0FSU0U9PSJNZXRyaWRpYSBwYWNpZmljYSJdIDwtICJNZXRyaWRpYSBzcHAuIgoKI1RoZSBvdGhlciBnZWFycyBhcmUgY29ycmVjdCwgc28gcmVidWlsZCBkYXRhc2V0CgpNZXRyaWRpYV9wYWNpZmljYV9FTUFfRmluYWwgPC0gcmJpbmQoTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzMzMywgTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzUwNSwgTWV0cmlkaWFfcGFjaWZpY2FfRU1BX3NtYWxsbmV0cykKCnVuZ3JvdXAoTWV0cmlkaWFfcGFjaWZpY2FfRU1BX0ZpbmFsKQoKI1JlbW92ZSBzb21lIGZpbGVzCgpybShNZXRyaWRpYV9wYWNpZmljYV9FTUFfYnlHRUFSX05BTUUsIE1ldHJpZGlhX3BhY2lmaWNhX0VNQV9zbWFsbG5ldHMsIE1ldHJpZGlhX3BhY2lmaWNhX0VNQV82MEJPTiwgTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzMzMywgTWV0cmlkaWFfcGFjaWZpY2FfRU1BXzYwQk9OXzUwNSkKCiNDb21iaW5lIGludG8gZmluYWwsIE1ldHJpZGlhX3BhY2lmaWNhIGRhdGEgc2V0CgpNZXRyaWRpYV9wYWNpZmljYSA8LSByYmluZChNZXRyaWRpYV9wYWNpZmljYV9FTUFfRmluYWwsIE1ldHJpZGlhX3BhY2lmaWNhX0Vjb0RBQVRfRmluYWwpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIE1ldHJpZGlhX3BhY2lmaWNhKQoKCmBgYAoKTWV0cmlkaWEgc3BwLgoKYGBge3J9CgpNZXRyaWRpYV9zcHAgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iTWV0cmlkaWEgc3BwLiIpCgojRmlsdGVyIGZvciB0aGUgc21hbGwgbmV0cyBvbmx5CgpNZXRyaWRpYV9zcHAgPC0gZmlsdGVyKE1ldHJpZGlhX3NwcCwgR0VBUl9OQU1FIT0iNjBCT04iKQoKI05vdyBmaWx0ZXIgb3V0IHRoZSBzdGFnZXMgdGhhdCBhcmUgYWNjdXJhdGUgZm9yIHRoZSBzbWFsbCBuZXRzLCBhbnl0aGluZyBsZXNzIHRoYW4gc3RhZ2UgQy0zCgpNZXRyaWRpYV9zcHAgPC0gZmlsdGVyKE1ldHJpZGlhX3NwcCwgU1RBR0VfTkFNRSE9ICJDLTEgVE8gQy01IikKTWV0cmlkaWFfc3BwIDwtIGZpbHRlcihNZXRyaWRpYV9zcHAsIFNUQUdFX05BTUUhPSAiQzMtNCIpCk1ldHJpZGlhX3NwcCA8LSBmaWx0ZXIoTWV0cmlkaWFfc3BwLCBTVEFHRV9OQU1FIT0gIkMzLTUiKQpNZXRyaWRpYV9zcHAgPC0gZmlsdGVyKE1ldHJpZGlhX3NwcCwgU1RBR0VfTkFNRSE9ICJDIC0gNCAoQ09QRVBPRElURSBJVikiKQoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgTWV0cmlkaWFfc3BwKQoKCmBgYAoKCk15c2lkcwoKYGBge3J9CgpNeXNpZGFlIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik15c2lkYWUiKQoKI0ZpbHRlciBmb3IgNjBCT04gbmV0cyBvbmx5CgpNeXNpZGFlIDwtIGZpbHRlcihNeXNpZGFlLCBHRUFSX05BTUU9PSI2MEJPTiIpCgoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBNeXNpZGFlKQoKCgpgYGAKCgoKTmVvY2FsYW51cyBjcmlzdGF0dXMKCmBgYHtyfQoKQ3Jpc3RhdHVzIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik5lb2NhbGFudXMgY3Jpc3RhdHVzIikKCgojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzCgpDcmlzdGF0dXNfRU1BIDwtIGZpbHRlcihDcmlzdGF0dXMsIERBVEFfU09VUkNFPT0iRU1BIikKQ3Jpc3RhdHVzX0Vjb0RBQVQgPC0gZmlsdGVyKENyaXN0YXR1cywgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikKCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhCgpDcmlzdGF0dXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0gPC0gZ3JvdXBfYnkoQ3Jpc3RhdHVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0sIE1FU0gsIEdFQVJfTkFNRSkKCkNyaXN0YXR1c19FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShDcmlzdGF0dXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sbigpKQoKI0RvIHNvbWUgZmlsdGVyaW5nIHRvIGdldCB0aGUgY29ycmVjdCBzdGFnZXMgZnJvbSB0aGUgY29ycmVjdCBnZWFyIGZvciBFY29EQUFUIGRhdGEKCkNyaXN0YXR1c19FY29EQUFUX0EgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQSIpCkNyaXN0YXR1c19FY29EQUFUX0EgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFUX0EsIE1FU0ghPTE1MykKCkNyaXN0YXR1c19FY29EQUFUX0IgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQiIpCkNyaXN0YXR1c19FY29EQUFUX0IgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFUX0IsIE1FU0ghPTE1MykKCkNyaXN0YXR1c19FY29EQUFUX0MgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQyIpCkNyaXN0YXR1c19FY29EQUFUX0MgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFUX0MsIE1FU0g9PTE1MykKQ3Jpc3RhdHVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoQ3Jpc3RhdHVzX0Vjb0RBQVRfQywgR0VBUl9OQU1FPT0iMjBCT04iKQoKQ3Jpc3RhdHVzX0Vjb0RBQVRfRiA8LSBmaWx0ZXIoQ3Jpc3RhdHVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJGIikKCkNyaXN0YXR1c19FY29EQUFUX0cgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iRyIpCgpDcmlzdGF0dXNfRWNvREFBVF9IIDwtIGZpbHRlcihDcmlzdGF0dXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkgiKQoKQ3Jpc3RhdHVzX0Vjb0RBQVRfSyA8LSBmaWx0ZXIoQ3Jpc3RhdHVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk09PSJLIikKCkNyaXN0YXR1c19FY29EQUFUX0wgPC0gZmlsdGVyKENyaXN0YXR1c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iTCIpCgojVGhlIG90aGVyIGdlYXJzIGFyZSBjb3JyZWN0LCBzbyByZWJ1aWxkIGRhdGFzZXQKCkNyaXN0YXR1c19FY29EQUFUX0ZpbmFsIDwtIHJiaW5kKENyaXN0YXR1c19FY29EQUFUX0EsIENyaXN0YXR1c19FY29EQUFUX0IsIENyaXN0YXR1c19FY29EQUFUX0MsIENyaXN0YXR1c19FY29EQUFUX0YsIENyaXN0YXR1c19FY29EQUFUX0csIENyaXN0YXR1c19FY29EQUFUX0gsIENyaXN0YXR1c19FY29EQUFUX0ssIENyaXN0YXR1c19FY29EQUFUX0wpCgp1bmdyb3VwKENyaXN0YXR1c19FY29EQUFUX0ZpbmFsKQoKI1JlbW92ZSBzb21lIGZpbGVzCgpybShDcmlzdGF0dXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sIENyaXN0YXR1c19FY29EQUFUX0EsIENyaXN0YXR1c19FY29EQUFUX0IsIENyaXN0YXR1c19FY29EQUFUX0MsIENyaXN0YXR1c19FY29EQUFUX0YsIENyaXN0YXR1c19FY29EQUFUX0csIENyaXN0YXR1c19FY29EQUFUX0gsIENyaXN0YXR1c19FY29EQUFUX0ssIENyaXN0YXR1c19FY29EQUFUX0wpCgojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzCgojQ2hlY2sgdG8gc2VlIGlmIHdoYXQgc3RhZ2VzIGFyZSB3aGVyZSB3aXRoIEVNQSBkYXRhCgpDcmlzdGF0dXNfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KENyaXN0YXR1c19FTUEsIE1FU0gsIEdFQVJfTkFNRSkKCkNyaXN0YXR1c19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKENyaXN0YXR1c19FTUFfYnlHRUFSX05BTUUsIG4oKSkKCiNObyBpc3N1ZXMgd2l0aCBtaXNtYXRjaGVkIG1lc2ggYW5kIGdlYXIgc2l6ZXMuIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMKCkNyaXN0YXR1c19FTUFfRmluYWwgPC0gIGZpbHRlcihDcmlzdGF0dXNfRU1BLCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkiKQoKCnVuZ3JvdXAoQ3Jpc3RhdHVzX0VNQV9GaW5hbCkKCgojTm93IGNvbWJpbmUgRU1BIGFuZCBFY29EQUFUIGRhdGEgdG9nZXRoZXIKCkNyaXN0YXR1c19GaW5hbCA8LSByYmluZChDcmlzdGF0dXNfRU1BX0ZpbmFsLCBDcmlzdGF0dXNfRWNvREFBVF9GaW5hbCkKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIENyaXN0YXR1c19GaW5hbCkKCgpgYGAKCgpOZW9jYWxhbnVzIHNwcC4KCmBgYHtyfQoKTmVvY2FsYW51cyA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJOZW9jYWxhbnVzIHNwcC4iKQoKCiNTZXBhcmF0ZSBFTUEgZGF0YSBhcyB0aGV5IHdlcmUgc29ydGVkIHVuZGVyIGRpZmZlcmVudCBwcm90b2NvbHMKCk5lb2NhbGFudXNfRU1BIDwtIGZpbHRlcihOZW9jYWxhbnVzLCBEQVRBX1NPVVJDRT09IkVNQSIpCk5lb2NhbGFudXNfRWNvREFBVCA8LSBmaWx0ZXIoTmVvY2FsYW51cywgREFUQV9TT1VSQ0U9PSJFY29EQUFUIikKCiNDaGVjayB0byBzZWUgaWYgcmlnaHQgc3RhZ2VzIGFyZSBpbiB0aGUgRWNvREFBVCBkYXRhCgpOZW9jYWxhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KE5lb2NhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STSwgTUVTSCwgR0VBUl9OQU1FKQoKTmVvY2FsYW51c19FY29EQUFUX0Zvcm1TdW1tYXJ5IDwtIHN1bW1hcmlzZShOZW9jYWxhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLG4oKSkKCiNEbyBzb21lIGZpbHRlcmluZyB0byBnZXQgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZyb20gdGhlIGNvcnJlY3QgZ2VhciBmb3IgRWNvREFBVCBkYXRhCgpOZW9jYWxhbnVzX0Vjb0RBQVRfQiA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iQiIpCk5lb2NhbGFudXNfRWNvREFBVF9CIDwtIGZpbHRlcihOZW9jYWxhbnVzX0Vjb0RBQVRfQiwgTUVTSCE9MTUzKQoKTmVvY2FsYW51c19FY29EQUFUX0MgPC0gZmlsdGVyKE5lb2NhbGFudXNfRWNvREFBVCwgU1BFQ0lNRU5fRk9STT09IkMiKQpOZW9jYWxhbnVzX0Vjb0RBQVRfQyA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFUX0MsIE1FU0g9PTE1MykKTmVvY2FsYW51c19FY29EQUFUX0MgPC0gZmlsdGVyKE5lb2NhbGFudXNfRWNvREFBVF9DLCBHRUFSX05BTUU9PSIyMEJPTiIpCgpOZW9jYWxhbnVzX0Vjb0RBQVRfRyA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iRyIpCgpOZW9jYWxhbnVzX0Vjb0RBQVRfSCA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iSCIpCgpOZW9jYWxhbnVzX0Vjb0RBQVRfSyA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iSyIpCgpOZW9jYWxhbnVzX0Vjb0RBQVRfTCA8LSBmaWx0ZXIoTmVvY2FsYW51c19FY29EQUFULCBTUEVDSU1FTl9GT1JNPT0iTCIpCgojVGhlIG90aGVyIGdlYXJzIGFyZSBjb3JyZWN0LCBzbyByZWJ1aWxkIGRhdGFzZXQKCk5lb2NhbGFudXNfRWNvREFBVF9GaW5hbCA8LSByYmluZChOZW9jYWxhbnVzX0Vjb0RBQVRfQiwgTmVvY2FsYW51c19FY29EQUFUX0MsIE5lb2NhbGFudXNfRWNvREFBVF9HLCBOZW9jYWxhbnVzX0Vjb0RBQVRfSCwgTmVvY2FsYW51c19FY29EQUFUX0ssIE5lb2NhbGFudXNfRWNvREFBVF9MKQoKdW5ncm91cChOZW9jYWxhbnVzX0Vjb0RBQVRfRmluYWwpCgojUmVtb3ZlIHNvbWUgZmlsZXMKCnJtKE5lb2NhbGFudXNfRWNvREFBVF9ieVNQRUNJTUVOX0ZPUk0sIE5lb2NhbGFudXNfRWNvREFBVF9CLCBOZW9jYWxhbnVzX0Vjb0RBQVRfQywgTmVvY2FsYW51c19FY29EQUFUX0csIE5lb2NhbGFudXNfRWNvREFBVF9ILCBOZW9jYWxhbnVzX0Vjb0RBQVRfSywgTmVvY2FsYW51c19FY29EQUFUX0wpCgojTm93IGZpbHRlciB0aGUgRU1BIGRhdGEgdG8gbWF0Y2ggdGhlIEVjb0RBQVQgZGF0YS4gRU1BIHRlbmRzIHRvIGRvdWJsZSBjb3VudCB2YXJpYWJsZXMgZnJvbSBib3RoIG5ldHMsIHNvIGVsaW1pbmF0ZSB0aGlzCgojQ2hlY2sgdG8gc2VlIGlmIHdoYXQgc3RhZ2VzIGFyZSB3aGVyZSB3aXRoIEVNQSBkYXRhCgpOZW9jYWxhbnVzX0VNQV9ieUdFQVJfTkFNRSA8LSBncm91cF9ieShOZW9jYWxhbnVzX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQoKTmVvY2FsYW51c19FTUFfR2VhclN1bW1hcnkgPC0gc3VtbWFyaXNlKE5lb2NhbGFudXNfRU1BX2J5R0VBUl9OQU1FLCBuKCkpCgojTm8gaXNzdWVzIHdpdGggbWlzbWF0Y2hlZCBtZXNoIGFuZCBnZWFyIHNpemVzLiBOZWVkIHRvIGZpbHRlciBmb3IgdGhlIGNvcnJlY3Qgc3RhZ2VzIGZvciBhdm9pZCBkb3VibGUgY291bnRzCgpOZW9jYWxhbnVzX0VNQV9GaW5hbCA8LSAgZmlsdGVyKE5lb2NhbGFudXNfRU1BLCBTVEFHRV9OQU1FPT0iQURVTFQifFNUQUdFX05BTUU9PSJDIC0gNSAoQ09QRVBPRElURSBWKSJ8U1RBR0VfTkFNRT09IkMgLSA0IChDT1BFUE9ESVRFIElWKSJ8U1RBR0VfTkFNRT09IkMgLSAzIChDT1BFUE9ESVRFIElJSSkiKQoKCnVuZ3JvdXAoTmVvY2FsYW51c19FTUFfRmluYWwpCgoKI05PdyBjb21iaW5lIEVNQSBhbmQgRWNvREFBVCBkYXRhIHRvZ2V0aGVyCgpOZW9jYWxhbnVzX0ZpbmFsIDwtIHJiaW5kKE5lb2NhbGFudXNfRU1BX0ZpbmFsLCBOZW9jYWxhbnVzX0Vjb0RBQVRfRmluYWwpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBOZW9jYWxhbnVzX0ZpbmFsKQoKCmBgYAoKCk9pdGhvbmEgc3BwLgoKYGBge3J9CgpPaXRob25hIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09Ik9pdGhvbmEgc3BwLiIpCgojRmlsdGVyIGZvciBzbWFsbCBuZXRzIG9ubHkKCk9pdGhvbmEgPC0gZmlsdGVyKE9pdGhvbmEsIEdFQVJfTkFNRSE9IjYwQk9OIikKCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBPaXRob25hKQoKCmBgYAoKT3N0cmFjb2RhCgoKYGBge3J9CgpPc3RyYWNvZGEgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iT3N0cmFjb2RhIikKCgoKYGBgCgoKUG9seWNoYWV0YQoKYGBge3J9CgpQb2x5Y2hhZXRhIDwtIGZpbHRlcihOQlNfWm9vcF9Qcm9jZXNzLCBUQVhBX0NPQVJTRT09IlBvbHljaGFldGEiKQoKI1NwbGl0IGludG8gc21hbGwgYW5kIGxhcmdlIGVzdGltYXRlcyBmcm9tIHRoZSBjb3JyZWN0IG5ldHMgYW5kIG1lc2hlcwoKUG9seWNoYWV0YV9sYXJnZSA8LSBmaWx0ZXIoUG9seWNoYWV0YSwgR0VBUl9OQU1FPT0iNjBCT04iKQoKCiNSZW5hbWUgUG9seWNoYWV0YSBsYXJnZQoKUG9seWNoYWV0YV9sYXJnZSRUQVhBX0NPQVJTRVtQb2x5Y2hhZXRhX2xhcmdlJFRBWEFfQ09BUlNFPT0iUG9seWNoYWV0YSJdIDwtICJQb2x5Y2hhZXRhX2xhcmdlIgoKCiNOb3cgZG8gdGhlIHNtYWxsIG5ldHMKClBvbHljaGFldGFfc21hbGwgPC0gZmlsdGVyKFBvbHljaGFldGEsIEdFQVJfTkFNRSE9IjYwQk9OIikKCiNSZW5hbWUgUG9seWNoYWV0YSBzbWFsbAoKUG9seWNoYWV0YV9zbWFsbCRUQVhBX0NPQVJTRVtQb2x5Y2hhZXRhX3NtYWxsJFRBWEFfQ09BUlNFPT0iUG9seWNoYWV0YSJdIDwtICJQb2x5Y2hhZXRhX3NtYWxsIgoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFBvbHljaGFldGFfbGFyZ2UsIFBvbHljaGFldGFfc21hbGwpCgoKCmBgYAoKClBzZXVkb2NhbGFudXMKCmBgYHtyfQoKUHNldWRvY2FsYW51cyA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJQc2V1ZG9jYWxhbnVzIHNwcC4iKQoKI0ZpbHRlciBmb3IgdGhlIHNtYWxsIG5ldHMgb25seQoKUHNldWRvY2FsYW51cyA8LSBmaWx0ZXIoUHNldWRvY2FsYW51cywgR0VBUl9OQU1FIT0iNjBCT04iKQoKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFBzZXVkb2NhbGFudXMpCgoKYGBgCgoKVGhhbGlhY2VhCgpgYGB7cn0KClRoYWxpYWNlYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJUaGFsaWFjZWEiKQoKYGBgCgoKVGhlbWlzdG8gYWJ5c3NvcnVtCgpgYGB7cn0KClRoZW1pc3RvX2FieXNzb3J1bSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJUaGVtaXN0byBhYnlzc29ydW0iKQoKYGBgCgoKVGhlbWlzdG8gbGliZWxsdWxhCgpgYGB7cn0KClRoZW1pc3RvX2xpYmVsbHVsYSA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJUaGVtaXN0byBsaWJlbGx1bGEiKQoKI0ZpbHRlciBmb3IgdGhlIDYwQk9OIG5ldHMgb25seQoKVGhlbWlzdG9fbGliZWxsdWxhIDwtIGZpbHRlcihUaGVtaXN0b19saWJlbGx1bGEsIEdFQVJfTkFNRT09IjYwQk9OIikKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgVGhlbWlzdG9fbGliZWxsdWxhKQoKYGBgCgoKVGhlbWlzdG8gcGFjaWZpY2EKCmBgYHtyfQoKVGhlbWlzdG9fcGFjaWZpY2EgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iVGhlbWlzdG8gcGFjaWZpY2EiKQoKI0ZpbHRlciBmb3IgdGhlIDYwQk9OIG5ldHMgb25seQoKVGhlbWlzdG9fcGFjaWZpY2EgPC0gZmlsdGVyKFRoZW1pc3RvX3BhY2lmaWNhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFRoZW1pc3RvX3BhY2lmaWNhKQoKCmBgYAoKVGhlbWlzdG8gc3BwLgoKYGBge3J9CgpUaGVtaXN0byA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJUaGVtaXN0byBzcHAuIikKCiNGaWx0ZXIgZm9yIHRoZSA2MEJPTiBuZXRzIG9ubHkKClRoZW1pc3RvPC0gZmlsdGVyKFRoZW1pc3RvLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojQWRkIHRvIGZpbmFsIGRhdGFzZXQKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gcmJpbmQgKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFRoZW1pc3RvKQoKCmBgYAoKClRoeXNhbm9lc3NhIHNwZWNpZXMKCmBgYHtyfQoKVGh5c2Fub2Vzc2EgPC0gZmlsdGVyKE5CU19ab29wX1Byb2Nlc3MsIFRBWEFfQ09BUlNFPT0iVGh5c2Fub2Vzc2EgaW5lcm1pcyJ8VEFYQV9DT0FSU0U9PSJUaHlzYW5vZXNzYSBpbnNwaW5hdGEifFRBWEFfQ09BUlNFPT0iVGh5c2Fub2Vzc2EgbG9uZ2lwZXMifFRBWEFfQ09BUlNFPT0iVGh5c2Fub2Vzc2EgcmFzY2hpaSJ8VEFYQV9DT0FSU0U9PSJUaHlzYW5vZXNzYSBzcGluaWZlcmEiKQoKI1NlbGVjdCBmb3IgNjBCT04gb25seQoKVGh5c2Fub2Vzc2EgPC0gZmlsdGVyKFRoeXNhbm9lc3NhLCBHRUFSX05BTUU9PSI2MEJPTiIpCgojTm93IHRoZSBjb3JyZWN0IHN0YWdlcwoKVGh5c2Fub2Vzc2EgPC0gZmlsdGVyKFRoeXNhbm9lc3NhLCBTVEFHRV9OQU1FPT0iQSArIEogKEFEVUxUL0pVVkVOSUxFKSJ8U1RBR0VfTkFNRT09IkpVVkVOSUxFInxTVEFHRV9OQU1FPT0iQURVTFQiKQoKI0FkZCB0byBmaW5hbCBkYXRhc2V0CgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIHJiaW5kIChOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBUaHlzYW5vZXNzYSkKCmBgYAoKClRvcnRhbnVzIGRpc2NhdWRhdHVzCgoKYGBge3J9CgpUb3J0YW51cyA8LSBmaWx0ZXIoTkJTX1pvb3BfUHJvY2VzcywgVEFYQV9DT0FSU0U9PSJUb3J0YW51cyBkaXNjYXVkYXR1cyIpCgojU2VwYXJhdGUgRU1BIGRhdGEgYXMgdGhleSB3ZXJlIHNvcnRlZCB1bmRlciBkaWZmZXJlbnQgcHJvdG9jb2xzCgpUb3J0YW51c19FTUEgPC0gZmlsdGVyKFRvcnRhbnVzLCBEQVRBX1NPVVJDRT09IkVNQSIpClRvcnRhbnVzX0Vjb0RBQVQgPC0gZmlsdGVyKFRvcnRhbnVzLCBEQVRBX1NPVVJDRT09IkVjb0RBQVQiKQoKI0NoZWNrIHRvIHNlZSBpZiByaWdodCBzdGFnZXMgYXJlIGluIHRoZSBFY29EQUFUIGRhdGEKClRvcnRhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNIDwtIGdyb3VwX2J5KFRvcnRhbnVzX0Vjb0RBQVQsIFNQRUNJTUVOX0ZPUk0sIE1FU0gsIEdFQVJfTkFNRSkKClRvcnRhbnVzX0Vjb0RBQVRfRm9ybVN1bW1hcnkgPC0gc3VtbWFyaXNlKFRvcnRhbnVzX0Vjb0RBQVRfYnlTUEVDSU1FTl9GT1JNLG4oKSkKCiNFY29EQUFUIGRhdGEgYXJlIGNvcnJlY3RseSBzcGVjaWZpZWQKCgoKI05vdyBmaWx0ZXIgdGhlIEVNQSBkYXRhIHRvIG1hdGNoIHRoZSBFY29EQUFUIGRhdGEuIEVNQSB0ZW5kcyB0byBkb3VibGUgY291bnQgdmFyaWFibGVzIGZyb20gYm90aCBuZXRzLCBzbyBlbGltaW5hdGUgdGhpcwoKI0NoZWNrIHRvIHNlZSBpZiB3aGF0IHN0YWdlcyBhcmUgd2hlcmUgd2l0aCBFTUEgZGF0YQoKVG9ydGFudXNfRU1BX2J5R0VBUl9OQU1FIDwtIGdyb3VwX2J5KFRvcnRhbnVzX0VNQSwgTUVTSCwgR0VBUl9OQU1FKQoKVG9ydGFudXNfRU1BX0dlYXJTdW1tYXJ5IDwtIHN1bW1hcmlzZShUb3J0YW51c19FTUFfYnlHRUFSX05BTUUsIG4oKSkKCiNObyBpc3N1ZXMgd2l0aCBtaXNtYXRjaGVkIG1lc2ggYW5kIGdlYXIgc2l6ZXMuIE5lZWQgdG8gZmlsdGVyIGZvciB0aGUgY29ycmVjdCBzdGFnZXMgZm9yIGF2b2lkIGRvdWJsZSBjb3VudHMKClRvcnRhbnVzX0VNQV82MEJPTiA8LSBmaWx0ZXIoVG9ydGFudXNfRU1BLCBHRUFSX05BTUU9PSI2MEJPTiIpCgpUb3J0YW51c19FTUFfNjBCT05fMzMzIDwtIGZpbHRlcihUb3J0YW51c19FTUFfNjBCT04sIE1FU0g9PTMzMykKClRvcnRhbnVzX0VNQV82MEJPTl8zMzMgPC0gZmlsdGVyKFRvcnRhbnVzX0VNQV82MEJPTl8zMzMsIFNUQUdFX05BTUU9PSJBRFVMVCJ8U1RBR0VfTkFNRT09IkMgLSA1IChDT1BFUE9ESVRFIFYpIikKClRvcnRhbnVzX0VNQV82MEJPTl81MDUgPC0gZmlsdGVyKFRvcnRhbnVzX0VNQV82MEJPTiwgTUVTSD09NTA1KQoKVG9ydGFudXNfRU1BXzYwQk9OXzUwNSA8LSBmaWx0ZXIoVG9ydGFudXNfRU1BXzYwQk9OXzUwNSwgU1RBR0VfTkFNRT09IkFEVUxUInxTVEFHRV9OQU1FPT0iQyAtIDUgKENPUEVQT0RJVEUgVikiKQoKCgpUb3J0YW51c19FTUFfc21hbGxuZXRzIDwtIGZpbHRlcihUb3J0YW51c19FTUEsIEdFQVJfTkFNRSE9IjYwQk9OIikKCgpUb3J0YW51c19FTUFfc21hbGxuZXRzIDwtIGZpbHRlcihUb3J0YW51c19FTUFfc21hbGxuZXRzLCBTVEFHRV9OQU1FPT0iQyAtIDQgKENPUEVQT0RJVEUgSVYpInxTVEFHRV9OQU1FPT0iQyAtIDMgKENPUEVQT0RJVEUgSUlJKSJ8U1RBR0VfTkFNRT09IkMgLSAyIChDT1BFUE9ESVRFIElJKSJ8U1RBR0VfTkFNRT09IkMgLSAxIChDT1BFUE9ESVRFIEkpIikKCiNUaGUgb3RoZXIgZ2VhcnMgYXJlIGNvcnJlY3QsIHNvIHJlYnVpbGQgZGF0YXNldAoKVG9ydGFudXNfRU1BX0ZpbmFsIDwtIHJiaW5kKFRvcnRhbnVzX0VNQV82MEJPTl8zMzMsIFRvcnRhbnVzX0VNQV82MEJPTl81MDUsIFRvcnRhbnVzX0VNQV9zbWFsbG5ldHMpCgp1bmdyb3VwKFRvcnRhbnVzX0VNQV9GaW5hbCkKCiNSZW1vdmUgc29tZSBmaWxlcwoKcm0oVG9ydGFudXNfRU1BX2J5R0VBUl9OQU1FLCAgVG9ydGFudXNfRU1BX3NtYWxsbmV0cywgVG9ydGFudXNfRU1BXzYwQk9OLCBUb3J0YW51c19FTUFfNjBCT05fMzMzLCBUb3J0YW51c19FTUFfNjBCT05fNTA1KQoKI0NvbWJpbmUgaW50byBmaW5hbCwgVG9ydGFudXMgZGF0YSBzZXQKClRvcnRhbnVzIDwtIHJiaW5kKFRvcnRhbnVzX0VNQV9GaW5hbCwgVG9ydGFudXNfRWNvREFBVCkKCiNBZGQgdG8gZmluYWwgZGF0YXNldAoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSByYmluZCAoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgVG9ydGFudXMpCgoKYGBgCk5vdyBkbyBiaW9tYXNzIGNvbnZlcnNpb25zCgoKYGBge3J9CgojTk93IHJlYWQgaW4gdGhlIGJpb21hc3MgY29udmVyc2lvbiBkYXRhIHNldAoKQmlvbWFzc19hbm5vdGF0ZWQgPC0gcmVhZF94bHN4KGhlcmUoImRhdGEiLCAiQmlvbWFzcyIsICJCaW9tYXNzLUFubm90YXRlZC54bHN4IikpCgojTWVyZ2UgdGhlIHR3byBkYXRhIHNldHMgYmFzZWQgb24gVEFYQV9DT0FSU0UsIFNUQUdFX05BTUUsIFNFWF9OQU1FCgpOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsIDwtIGxlZnRfam9pbihOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsLCBCaW9tYXNzX2Fubm90YXRlZCwgYnkgPSBjKCJUQVhBX0NPQVJTRSIsICJTVEFHRV9OQU1FIiwgIlNFWF9OQU1FIikpCgojRG8gc29tZSB0aWR5aW5nIHRvIGVsaW1pbmF0ZSBzb21lIGNvbHVtbnMKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwkTk9URSA8LSBOVUxMCk5CU19ab29wX1Byb2Nlc3NfRmluYWwkSU5EX1dXX01HX05PVEUgPC0gTlVMTApOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsJElORF9EV19NR19DT05WRVJURURfTk9URSA8LSBOVUxMCk5CU19ab29wX1Byb2Nlc3NfRmluYWwkSU5EX0NfTUdfQ09OVkVSVEVEX05PVEUgPC0gTlVMTApOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsJEdST1dUSF9SQVRFX05PVEUgPC0gTlVMTAoKI0NyZWF0ZSB3ZXQgd2VpZ2h0IGJpb21hc3MgY29sdW1uIGNvbnZlcnRlZCBpbmRpdmlkdWFsIHdldCB3ZWlnaHQgYW5kIGFidW5kYW5jZQoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSBtdXRhdGUoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQklPTUFTU19XV19NR19NM19NRUFOID0gSU5EX1dXX01HX01FQVNVUkVEX01FQU4qRVNUX05VTV9QRVJNMykKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJJT01BU1NfV1dfTUdfTTNfU0QgPSBJTkRfV1dfTUdfTUVBU1VSRURfU0QqRVNUX05VTV9QRVJNMykKCiNDcmVhdGUgZHJ5IHdlaWdodCBiaW9tYXNzIGNvbHVtbiBjb252ZXJ0ZWQgaW5kaXZpZHVhbCBkcnkgd2VpZ2h0IGFuZCBhYnVuZGFuY2UKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJJT01BU1NfRFdfTUdfTTNfTUVBTiA9IElORF9EV19NR19DT05WRVJURURfTUVBTipFU1RfTlVNX1BFUk0zKQoKTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCA8LSBtdXRhdGUoTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCwgQklPTUFTU19EV19NR19NM19TRCA9IElORF9EV19NR19DT05WRVJURURfU0QqRVNUX05VTV9QRVJNMykKCiNDcmVhdGUgY2FyYm9uIHdlaWdodCBiaW9tYXNzIGNvbHVtbiBjb252ZXJ0ZWQgaW5kaXZpZHVhbCBjYXJib24gd2VpZ2h0IGFuZCBhYnVuZGFuY2UKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJJT01BU1NfQ19NR19NM19NRUFOID0gSU5EX0NfTUdfQ09OVkVSVEVEX01FQU4qRVNUX05VTV9QRVJNMykKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIEJJT01BU1NfQ19NR19NM19TRCA9IElORF9DX01HX0NPTlZFUlRFRF9TRCpFU1RfTlVNX1BFUk0zKQoKCiNDcmVhdGUgY2FyYm9uIHdlaWdodCBiaW9tYXNzIGNvbHVtbiBjb252ZXJ0ZWQgaW5kaXZpZHVhbCBjYXJib24gd2VpZ2h0IGFuZCBhYnVuZGFuY2UKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFBST0RVQ1RJT05fTUdfQ19EX01FQU4gPSAoSU5EX0NfTUdfQ09OVkVSVEVEX01FQU4qRVNUX05VTV9QRVJNMypHUk9XVEhfUkFURV9NRUFOKSoyNCkKCk5CU19ab29wX1Byb2Nlc3NfRmluYWwgPC0gbXV0YXRlKE5CU19ab29wX1Byb2Nlc3NfRmluYWwsIFBST0RVQ1RJT05fTUdfQ19EX1NEID0gKElORF9DX01HX0NPTlZFUlRFRF9TRCpFU1RfTlVNX1BFUk0zKkdST1dUSF9SQVRFX1NEKSoyNCkKCmBgYAoKLSBBZGQgaW4gbmV3IGRhdGEgKGFzIG9mIEp1bHkgMjAyNCkKCmBgYHtyfQpuZXdfem9vcCA8LSByZWFkLmNzdigiZGF0YS9BbGxab29wX1Jhd18yNkpVTDIwMjQuY3N2IikgJT4lIAogICAgICAgICAgICAgZmlsdGVyKFlFQVI+IDIwMTksCiAgICAgICAgICAgICAgICAgICAgIUxBVDw1NS4wNDczLAogICAgICAgICAgICAgICAgICAgICFMQVQ+NjYuMSkgCmBgYAoKIyBDb21wYXJlIDIwMTkgYmV0d2VlbiBib3RoIGRhdGFzZXRzIHRvIGNoZWNrCi0gQmlnIGRpZmZlcmVuY2UgaXMgYSBsYXQgbG9uZ2l0dWRlIGZpbHRlciwgb25jZSBJIGFkZCB0aGF0IGl0J3MgZmluZS4KCmBgYHtyLCBldmFsID0gRkFMU0V9Cm5ld196b29wXzIwMTkgPC0gcmVhZC5jc3YoImRhdGEvQWxsWm9vcF9SYXdfMjZKVUwyMDI0LmNzdiIpICU+JSAKICAgICAgICAgICAgIGZpbHRlcihZRUFSICVpbiUgYygyMDE3LDIwMTgsIDIwMTkpLAogICAgICAgICAgICAgICAgICAgIFRBWE9OX05BTUUgPT0gIkNhbGFudXMgbWFyc2hhbGxhZSIsCiAgICAgICAgICAgICAgICAgICAgIUxBVDw1NS4wNDczLAogICAgICAgICAgICAgICAgICAgICFMQVQ+NjYuMSkgIAogIApzdW1tX05FV19OQlMgPC0gbmV3X3pvb3BfMjAxOSAlPiUgCiAgICBncm91cF9ieShDUlVJU0UsSEFVTF9JRCxZRUFSLE1PTlRILERBWSxMQVQsTE9OLCBEQVRBX1NPVVJDRSxUQVhPTl9OQU1FKSAlPiUgIyBzdW0gYWNyb3NzIGxpZmUgc3RhZ2VzIAogICAgZHBseXI6OnN1bW1hcmlzZShFU1RfTlVNX1BFUk0zID0gIHN1bShFU1RfTlVNX1BFUk0zKSkgJT4lCiAgICBmaWx0ZXIoIUxBVDw1OCwKICAgICAgICAgICAhTEFUPjY1LAogICAgICAgICAgICFMT04+IC0xNTUsCiAgICAgICAgICAgIUxPTjwgLTE3MiwKICAgICAgICAgICBNT05USCAlaW4lIGMoNyw4LDksMTApKSAlPiUgCiAgICB1bml0ZSgiZGF0ZSIsIGMoWUVBUiwgTU9OVEgsIERBWSksIHNlcCA9ICIvIiwgcmVtb3ZlID0gRkFMU0UpICU+JQogICAgZHBseXI6Om11dGF0ZShkYXRlID0gYXMuRGF0ZShkYXRlLCAiJVkvJW0vJWQiKSwKICAgICAgICAgICAgICAgICAgRE9ZID0geWRheShkYXRlKSwKICAgICAgICAgICAgICAgICAgVEFYQV9DT0FSU0UgPSBjYXNlX3doZW4oZ3JlcGwocGF0dGVybiA9ICJUaGVtaXN0byIsIHg9VEFYT05fTkFNRSwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJsYXJnZV96b29wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJDYWxhbnVzIiwgeD1UQVhPTl9OQU1FLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gImxhcmdlX3pvb3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbChwYXR0ZXJuID0gIkNvcGVwb2RfbGFyZ2UiLCB4PVRBWE9OX05BTUUsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAibGFyZ2Vfem9vcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKHBhdHRlcm4gPSAiTmVvY2FsYW51cyIsIHg9VEFYT05fTkFNRSwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJsYXJnZV96b29wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKHBhdHRlcm4gPSAiQ25pZGFyaWFfc21hbGwiLCB4PVRBWE9OX05BTUUsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiQ25pZGVyaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbChwYXR0ZXJuID0gIkNuaWRhcmlhX2xhcmdlIiwgeD1UQVhPTl9OQU1FLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkNuaWRlcmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAib3RoZXIiKSkgJT4lIAogICAgZ3JvdXBfYnkoREFUQV9TT1VSQ0UsWUVBUiwgRE9ZLExBVCxMT04pICU+JSAjIHN1bSBhY3Jvc3Mgc3BlY2llcyAKICBkcGx5cjo6c3VtbWFyaXNlKHN1bV9FU1RfTlVNX1BFUk0zID0gc3VtKEVTVF9OVU1fUEVSTTMpKSAgJT4lIAogIGRwbHlyOjptdXRhdGUoWUVBUiA9IGFzLmZhY3RvcihZRUFSKSwKICAgICAgICAgREFUQV9TT1VSQ0UgPSBhcy5mYWN0b3IoREFUQV9TT1VSQ0UpKSAlPiUgCiAgZGF0YS5mcmFtZSgpICU+JSAKICBncm91cF9ieShZRUFSKSAlPiUgCiAgZHBseXI6OnN1bW1hcmlzZShtZWFuID0gbWVhbihzdW1fRVNUX05VTV9QRVJNMykpCgpOQlNfYWxsXzIwMTkgPC0gTkJTX1pvb3BfUHJvY2Vzc19GaW5hbCAlPiUgCiAgICAgICAgICAgICBmaWx0ZXIoWUVBUj09IDIwMTksCiAgICAgICAgICAgICAgICAgICAgVEFYT05fTkFNRSA9PSAiQ2FsYW51cyBtYXJzaGFsbGFlIikgCgoKCiBzdW1tX05CUyA8LSBOQlNfYWxsXzIwMTkgJT4lIAogICAgZ3JvdXBfYnkoQ1JVSVNFLEhBVUxfSUQsWUVBUixNT05USCxEQVksTEFULExPTiwgREFUQV9TT1VSQ0UsVEFYT05fTkFNRSkgJT4lICMgc3VtIGFjcm9zcyBsaWZlIHN0YWdlcyAKICAgIGRwbHlyOjpzdW1tYXJpc2UoRVNUX05VTV9QRVJNMyA9ICBzdW0oRVNUX05VTV9QRVJNMykpICU+JQogICAgZmlsdGVyKCFMQVQ8NTgsCiAgICAgICAgICAgIUxBVD42NSwKICAgICAgICAgICAhTE9OPiAtMTU1LAogICAgICAgICAgICFMT048IC0xNzIsCiAgICAgICAgICAgTU9OVEggJWluJSBjKDcsOCw5LDEwKSkgJT4lIAogICAgdW5pdGUoImRhdGUiLCBjKFlFQVIsIE1PTlRILCBEQVkpLCBzZXAgPSAiLyIsIHJlbW92ZSA9IEZBTFNFKSAlPiUKICAgIGRwbHlyOjptdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGF0ZSwgIiVZLyVtLyVkIiksCiAgICAgICAgICAgICAgICAgIERPWSA9IHlkYXkoZGF0ZSksCiAgICAgICAgICAgICAgICAgIFRBWEFfQ09BUlNFID0gY2FzZV93aGVuKGdyZXBsKHBhdHRlcm4gPSAiVGhlbWlzdG8iLCB4PVRBWE9OX05BTUUsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAibGFyZ2Vfem9vcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKHBhdHRlcm4gPSAiQ2FsYW51cyIsIHg9VEFYT05fTkFNRSwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJsYXJnZV96b29wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJDb3BlcG9kX2xhcmdlIiwgeD1UQVhPTl9OQU1FLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gImxhcmdlX3pvb3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbChwYXR0ZXJuID0gIk5lb2NhbGFudXMiLCB4PVRBWE9OX05BTUUsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAibGFyZ2Vfem9vcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbChwYXR0ZXJuID0gIkNuaWRhcmlhX3NtYWxsIiwgeD1UQVhPTl9OQU1FLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkNuaWRlcmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwocGF0dGVybiA9ICJDbmlkYXJpYV9sYXJnZSIsIHg9VEFYT05fTkFNRSwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJDbmlkZXJpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIm90aGVyIikpICU+JSAKICAgIGdyb3VwX2J5KERBVEFfU09VUkNFLFlFQVIsIERPWSxMQVQsTE9OKSAlPiUgIyBzdW0gYWNyb3NzIHNwZWNpZXMgCiAgZHBseXI6OnN1bW1hcmlzZShzdW1fRVNUX05VTV9QRVJNMyA9IHN1bShFU1RfTlVNX1BFUk0zKSkgICU+JSAKICBtdXRhdGUoWUVBUiA9IGFzLmZhY3RvcihZRUFSKSwKICAgICAgICAgREFUQV9TT1VSQ0UgPSBhcy5mYWN0b3IoREFUQV9TT1VSQ0UpKSAlPiUgCiAgZGF0YS5mcmFtZSgpCgogCgpgYGAKCgojIENvbWJpbmUgdGhlIHR3bwpgYGB7cn0KY29tYm8gPC0gcmJpbmQobmV3X3pvb3AgJT4lIAogICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoQ1JVSVNFLCBEQVksIEdFQVJfTkFNRSwgSEFVTF9JRCxMQVQsTE9OLERBVEFfU09VUkNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBR0VfTkFNRSxUQVhPTl9OQU1FLCBZRUFSLE1PTlRILEVTVF9OVU1fUEVSTTMpLAogICAgICAgICAgICAgICBOQlNfWm9vcF9Qcm9jZXNzX0ZpbmFsICU+JSAKICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KENSVUlTRSwgREFZLCBHRUFSX05BTUUsIEhBVUxfSUQsTEFULExPTixEQVRBX1NPVVJDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUdFX05BTUUsVEFYT05fTkFNRSxZRUFSLE1PTlRILEVTVF9OVU1fUEVSTTMpKQpgYGAKCgpgYGB7cn0Kd3JpdGUuY3N2KGNvbWJvLCBoZXJlKCJkYXRhIiwgIlByb2Nlc3NlZF9EYXRhIiwgIk5CU19ab29wX1Byb2Nlc3NfRmluYWwuY3N2IiksIHJvdy5uYW1lcyA9IEZBTFNFKQpgYGAKCgo=